File indexing completed on 2025-08-06 08:18:14
0001 #include "SvtxTrack_v1.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_v1::SvtxTrack_v1()
0014 {
0015
0016 _states.insert(std::make_pair(0.0, new SvtxTrackState_v1(0.0)));
0017 }
0018
0019 SvtxTrack_v1::SvtxTrack_v1(const SvtxTrack& source)
0020 {
0021 SvtxTrack_v1::CopyFrom(source);
0022 }
0023
0024
0025
0026
0027 SvtxTrack_v1::SvtxTrack_v1(const SvtxTrack_v1& source)
0028 : SvtxTrack(source)
0029 {
0030 SvtxTrack_v1::CopyFrom(source);
0031 }
0032
0033 SvtxTrack_v1& SvtxTrack_v1::operator=(const SvtxTrack_v1& source)
0034 {
0035 if (this != &source)
0036 {
0037 CopyFrom(source);
0038 }
0039 return *this;
0040 }
0041
0042 SvtxTrack_v1::~SvtxTrack_v1()
0043 {
0044 clear_states();
0045 }
0046
0047 void SvtxTrack_v1::CopyFrom(const SvtxTrack& source)
0048 {
0049
0050 if (this == &source)
0051 {
0052 return;
0053 }
0054
0055
0056 SvtxTrack::CopyFrom(source);
0057
0058 _track_id = source.get_id();
0059 _vertex_id = source.get_vertex_id();
0060 _is_positive_charge = source.get_positive_charge();
0061 _chisq = source.get_chisq();
0062 _ndf = source.get_ndf();
0063 _dca = source.get_dca();
0064 _dca_error = source.get_dca_error();
0065 _dca2d = source.get_dca2d();
0066 _dca2d_error = source.get_dca2d_error();
0067 _dca3d_xy = source.get_dca3d_xy();
0068 _dca3d_xy_error = source.get_dca3d_xy_error();
0069 _dca3d_z = source.get_dca3d_z();
0070 _dca3d_z_error = source.get_dca3d_z_error();
0071
0072
0073 clear_states();
0074 for (auto iter = source.begin_states(); iter != source.end_states(); ++iter)
0075 {
0076 _states.insert(std::make_pair(iter->first, static_cast<SvtxTrackState*>(iter->second->CloneMe())));
0077 }
0078
0079
0080 _cluster_ids.clear();
0081 std::copy(source.begin_clusters(), source.end_clusters(), std::inserter(_cluster_ids, _cluster_ids.begin()));
0082
0083
0084 _cluster_keys.clear();
0085 std::copy(source.begin_cluster_keys(), source.end_cluster_keys(), std::inserter(_cluster_keys, _cluster_keys.begin()));
0086
0087
0088 _cal_dphi.clear();
0089 _cal_deta.clear();
0090 _cal_energy_3x3.clear();
0091 _cal_energy_5x5.clear();
0092 _cal_cluster_id.clear();
0093 _cal_cluster_key.clear();
0094 _cal_cluster_e.clear();
0095
0096 for (const auto& type : {SvtxTrack::PRES, SvtxTrack::CEMC, SvtxTrack::HCALIN, SvtxTrack::HCALOUT})
0097 {
0098 if (!std::isnan(source.get_cal_dphi(type)))
0099 {
0100 set_cal_dphi(type, source.get_cal_dphi(type));
0101 }
0102 if (!std::isnan(source.get_cal_deta(type)))
0103 {
0104 set_cal_deta(type, source.get_cal_deta(type));
0105 }
0106 if (!std::isnan(source.get_cal_energy_3x3(type)))
0107 {
0108 set_cal_energy_3x3(type, source.get_cal_energy_3x3(type));
0109 }
0110 if (!std::isnan(source.get_cal_energy_5x5(type)))
0111 {
0112 set_cal_energy_5x5(type, source.get_cal_energy_5x5(type));
0113 }
0114 if (source.get_cal_cluster_id(type) != UINT_MAX)
0115 {
0116 set_cal_cluster_id(type, source.get_cal_cluster_id(type));
0117 }
0118 if (source.get_cal_cluster_key(type) != UINT_MAX)
0119 {
0120 set_cal_cluster_key(type, source.get_cal_cluster_key(type));
0121 }
0122 if (!std::isnan(source.get_cal_cluster_e(type)))
0123 {
0124 set_cal_cluster_e(type, source.get_cal_cluster_e(type));
0125 }
0126 }
0127 }
0128
0129 void SvtxTrack_v1::identify(std::ostream& os) const
0130 {
0131 os << "SvtxTrack_v1 Object ";
0132 os << "id: " << get_id() << " ";
0133 os << "vertex id: " << get_vertex_id() << " ";
0134 os << "charge: " << get_charge() << " ";
0135 os << "chisq: " << get_chisq() << " ndf:" << get_ndf() << " ";
0136 os << std::endl;
0137
0138 os << "(px,py,pz) = ("
0139 << get_px() << ","
0140 << get_py() << ","
0141 << get_pz() << ")" << std::endl;
0142
0143 os << "(x,y,z) = (" << get_x() << "," << get_y() << "," << get_z() << ")" << std::endl;
0144
0145 if (_cluster_ids.size() > 0 || _cluster_keys.size() > 0)
0146 {
0147 os << "list of cluster IDs ";
0148 for (SvtxTrack::ConstClusterIter iter = begin_clusters();
0149 iter != end_clusters();
0150 ++iter)
0151 {
0152 unsigned int cluster_id = *iter;
0153 os << cluster_id << " ";
0154 }
0155
0156 os << "list of cluster keys ";
0157 for (SvtxTrack::ConstClusterKeyIter iter = begin_cluster_keys();
0158 iter != end_cluster_keys();
0159 ++iter)
0160 {
0161 TrkrDefs::cluskey cluster_key = *iter;
0162 os << cluster_key << " ";
0163 }
0164 }
0165 else
0166 {
0167 os << " track has no clusters " << std::endl;
0168 }
0169
0170 os << std::endl;
0171
0172 return;
0173 }
0174
0175 void SvtxTrack_v1::clear_states()
0176 {
0177 for (const auto& pair : _states)
0178 {
0179 delete pair.second;
0180 }
0181
0182 _states.clear();
0183 }
0184
0185 int SvtxTrack_v1::isValid() const
0186 {
0187 return 1;
0188 }
0189
0190 const SvtxTrackState* SvtxTrack_v1::get_state(float pathlength) const
0191 {
0192 ConstStateIter iter = _states.find(pathlength);
0193 if (iter == _states.end())
0194 {
0195 return nullptr;
0196 }
0197 return iter->second;
0198 }
0199
0200 SvtxTrackState* SvtxTrack_v1::get_state(float pathlength)
0201 {
0202 StateIter iter = _states.find(pathlength);
0203 if (iter == _states.end())
0204 {
0205 return nullptr;
0206 }
0207 return iter->second;
0208 }
0209
0210 SvtxTrackState* SvtxTrack_v1::insert_state(const SvtxTrackState* state)
0211 {
0212 const auto copy = static_cast<SvtxTrackState*>(state->CloneMe());
0213 const auto [iterator, inserted] = _states.insert(std::make_pair(state->get_pathlength(), copy));
0214 if (!inserted)
0215 {
0216 delete copy;
0217 }
0218 return iterator->second;
0219 }
0220
0221 size_t SvtxTrack_v1::erase_state(float pathlength)
0222 {
0223 StateIter iter = _states.find(pathlength);
0224 if (iter == _states.end())
0225 {
0226 return _states.size();
0227 }
0228
0229 delete iter->second;
0230 _states.erase(iter);
0231 return _states.size();
0232 }
0233
0234 float SvtxTrack_v1::get_cal_dphi(SvtxTrack::CAL_LAYER layer) const
0235 {
0236 std::map<SvtxTrack::CAL_LAYER, float>::const_iterator citer = _cal_dphi.find(layer);
0237 if (citer == _cal_dphi.end())
0238 {
0239 return NAN;
0240 }
0241 return citer->second;
0242 }
0243
0244 float SvtxTrack_v1::get_cal_deta(SvtxTrack::CAL_LAYER layer) const
0245 {
0246 std::map<SvtxTrack::CAL_LAYER, float>::const_iterator citer = _cal_deta.find(layer);
0247 if (citer == _cal_deta.end())
0248 {
0249 return NAN;
0250 }
0251 return citer->second;
0252 }
0253
0254 float SvtxTrack_v1::get_cal_energy_3x3(SvtxTrack::CAL_LAYER layer) const
0255 {
0256 std::map<SvtxTrack::CAL_LAYER, float>::const_iterator citer = _cal_energy_3x3.find(layer);
0257 if (citer == _cal_energy_3x3.end())
0258 {
0259 return NAN;
0260 }
0261 return citer->second;
0262 }
0263
0264 float SvtxTrack_v1::get_cal_energy_5x5(SvtxTrack::CAL_LAYER layer) const
0265 {
0266 std::map<SvtxTrack::CAL_LAYER, float>::const_iterator citer = _cal_energy_5x5.find(layer);
0267 if (citer == _cal_energy_5x5.end())
0268 {
0269 return NAN;
0270 }
0271 return citer->second;
0272 }
0273
0274 unsigned int SvtxTrack_v1::get_cal_cluster_id(SvtxTrack::CAL_LAYER layer) const
0275 {
0276 std::map<SvtxTrack::CAL_LAYER, int>::const_iterator citer = _cal_cluster_id.find(layer);
0277 if (citer == _cal_cluster_id.end())
0278 {
0279 return -9999;
0280 }
0281 return citer->second;
0282 }
0283
0284 TrkrDefs::cluskey SvtxTrack_v1::get_cal_cluster_key(SvtxTrack::CAL_LAYER layer) const
0285 {
0286 std::map<SvtxTrack::CAL_LAYER, TrkrDefs::cluskey>::const_iterator citer = _cal_cluster_key.find(layer);
0287 if (citer == _cal_cluster_key.end())
0288 {
0289 return -9999;
0290 }
0291 return citer->second;
0292 }
0293
0294 float SvtxTrack_v1::get_cal_cluster_e(SvtxTrack::CAL_LAYER layer) const
0295 {
0296 std::map<SvtxTrack::CAL_LAYER, float>::const_iterator citer = _cal_cluster_e.find(layer);
0297 if (citer == _cal_cluster_e.end())
0298 {
0299 return NAN;
0300 }
0301 return citer->second;
0302 }