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