Back to home page

sPhenix code displayed by LXR

 
 

    


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   // always include the pca point
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 // have to suppress missingMemberCopy from cppcheck, it does not
0033 // go down to the CopyFrom method where things are done correctly
0034 // cppcheck-suppress missingMemberCopy
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   // do nothing if copying onto oneself
0058   if (this == &source)
0059   {
0060     return;
0061   }
0062 
0063   // parent class method
0064   SvtxTrack::CopyFrom(source);
0065 
0066   // copy acts covariance
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   // copy the states over into new state objects stored here
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   // copy over cluster ID set
0097   _cluster_ids.clear();
0098   std::copy(source.begin_clusters(), source.end_clusters(), std::inserter(_cluster_ids, _cluster_ids.begin()));
0099 
0100   // copy over cluster key set
0101   _cluster_keys.clear();
0102   std::copy(source.begin_cluster_keys(), source.end_cluster_keys(), std::inserter(_cluster_keys, _cluster_keys.begin()));
0103 
0104   // copy over calorimeter projections
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   // find closest iterator
0222   const auto pathlength = state->get_pathlength();
0223   auto iterator = _states.lower_bound(pathlength);
0224   if (iterator == _states.end() || pathlength < iterator->first)
0225   {
0226     // pathlength not found. Make a copy and insert
0227     const auto copy = static_cast<SvtxTrackState*>(state->CloneMe());
0228     iterator = _states.insert(iterator, std::make_pair(pathlength, copy));
0229   }
0230 
0231   // return matching state
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 }