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