File indexing completed on 2025-12-17 09:20:46
0001 #include "SvtxTrack_v4.h"
0002 #include "SvtxTrackState.h"
0003 #include "SvtxTrackState_v1.h"
0004
0005 #include <trackbase/TrkrDefs.h> // for cluskey
0006
0007 #include <phool/PHObject.h> // for PHObject
0008
0009 #include <climits>
0010 #include <map>
0011 #include <vector> // for vector
0012
0013 SvtxTrack_v4::SvtxTrack_v4()
0014 {
0015
0016 _states.insert(std::make_pair(0, new SvtxTrackState_v1(0)));
0017 }
0018
0019 SvtxTrack_v4::SvtxTrack_v4(const SvtxTrack& source)
0020 {
0021 SvtxTrack_v4::CopyFrom(source);
0022 }
0023
0024
0025
0026
0027 SvtxTrack_v4::SvtxTrack_v4(const SvtxTrack_v4& source)
0028 : SvtxTrack(source)
0029 {
0030 SvtxTrack_v4::CopyFrom(source);
0031 }
0032
0033 SvtxTrack_v4& SvtxTrack_v4::operator=(const SvtxTrack_v4& source)
0034 {
0035 if (this != &source)
0036 {
0037 CopyFrom(source);
0038 }
0039 return *this;
0040 }
0041
0042 SvtxTrack_v4::~SvtxTrack_v4()
0043 {
0044 clear_states();
0045 }
0046
0047 void SvtxTrack_v4::CopyFrom(const SvtxTrack& source)
0048 {
0049
0050 if (this == &source)
0051 {
0052 return;
0053 }
0054
0055
0056 SvtxTrack::CopyFrom(source);
0057
0058 _tpc_seed = source.get_tpc_seed();
0059 _silicon_seed = source.get_silicon_seed();
0060 _vertex_id = source.get_vertex_id();
0061 _is_positive_charge = source.get_positive_charge();
0062 _chisq = source.get_chisq();
0063 _ndf = source.get_ndf();
0064 _track_crossing = source.get_crossing();
0065
0066
0067 clear_states();
0068 for (auto iter = source.begin_states(); iter != source.end_states(); ++iter)
0069 {
0070 _states.insert(std::make_pair(iter->first, static_cast<SvtxTrackState*>(iter->second->CloneMe())));
0071 }
0072 }
0073
0074 void SvtxTrack_v4::identify(std::ostream& os) const
0075 {
0076 os << "SvtxTrack_v4 Object ";
0077 os << "id: " << get_id() << " ";
0078 os << "vertex id: " << get_vertex_id() << " ";
0079 os << "charge: " << get_charge() << " ";
0080 os << "chisq: " << get_chisq() << " ndf:" << get_ndf() << " ";
0081 os << "nstates: " << _states.size() << " ";
0082 os << std::endl;
0083
0084 os << "(px,py,pz) = ("
0085 << get_px() << ","
0086 << get_py() << ","
0087 << get_pz() << ")" << std::endl;
0088
0089 os << "(x,y,z) = (" << get_x() << "," << get_y() << "," << get_z() << ")" << std::endl;
0090
0091 os << "Silicon clusters " << std::endl;
0092 if (_silicon_seed)
0093 {
0094 for (auto iter = _silicon_seed->begin_cluster_keys();
0095 iter != _silicon_seed->end_cluster_keys();
0096 ++iter)
0097 {
0098 std::cout << *iter << ", ";
0099 }
0100 }
0101 os << std::endl
0102 << "Tpc + TPOT clusters " << std::endl;
0103 if (_tpc_seed)
0104 {
0105 for (auto iter = _tpc_seed->begin_cluster_keys();
0106 iter != _tpc_seed->end_cluster_keys();
0107 ++iter)
0108 {
0109 std::cout << *iter << ", ";
0110 }
0111 }
0112 os << std::endl;
0113
0114 return;
0115 }
0116
0117 void SvtxTrack_v4::clear_states()
0118 {
0119 for (const auto& pair : _states)
0120 {
0121 delete pair.second;
0122 }
0123
0124 _states.clear();
0125 }
0126
0127 int SvtxTrack_v4::isValid() const
0128 {
0129 return 1;
0130 }
0131
0132 const SvtxTrackState* SvtxTrack_v4::get_state(float pathlength) const
0133 {
0134 const auto iter = _states.find(pathlength);
0135 return (iter == _states.end()) ? nullptr : iter->second;
0136 }
0137
0138 SvtxTrackState* SvtxTrack_v4::get_state(float pathlength)
0139 {
0140 const auto iter = _states.find(pathlength);
0141 return (iter == _states.end()) ? nullptr : iter->second;
0142 }
0143
0144 SvtxTrackState* SvtxTrack_v4::insert_state(const SvtxTrackState* state)
0145 {
0146
0147 const auto pathlength = state->get_pathlength();
0148 auto iterator = _states.lower_bound(pathlength);
0149 if (iterator == _states.end() || pathlength < iterator->first)
0150 {
0151
0152 auto *const copy = static_cast<SvtxTrackState*>(state->CloneMe());
0153 iterator = _states.insert(iterator, std::make_pair(pathlength, copy));
0154 }
0155
0156
0157 return iterator->second;
0158 }
0159
0160 size_t SvtxTrack_v4::erase_state(float pathlength)
0161 {
0162 StateIter iter = _states.find(pathlength);
0163 if (iter == _states.end())
0164 {
0165 return _states.size();
0166 }
0167
0168 delete iter->second;
0169 _states.erase(iter);
0170 return _states.size();
0171 }