Back to home page

sPhenix code displayed by LXR

 
 

    


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   // always include the pca point
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 // have to suppress missingMemberCopy from cppcheck, it does not
0025 // go down to the CopyFrom method where things are done correctly
0026 // cppcheck-suppress missingMemberCopy
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   // do nothing if copying onto oneself
0050   if (this == &source)
0051   {
0052     return;
0053   }
0054 
0055   // parent class method
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   // copy the states over into new state objects stored here
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   // copy over cluster ID set
0080   _cluster_ids.clear();
0081   std::copy(source.begin_clusters(), source.end_clusters(), std::inserter(_cluster_ids, _cluster_ids.begin()));
0082 
0083   // copy over cluster key set
0084   _cluster_keys.clear();
0085   std::copy(source.begin_cluster_keys(), source.end_cluster_keys(), std::inserter(_cluster_keys, _cluster_keys.begin()));
0086 
0087   // copy over calorimeter projections
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 }