Back to home page

sPhenix code displayed by LXR

 
 

    


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   // always include the pca point
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 // 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_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   // 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   _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   // copy the states over into new state objects stored here
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   // copy over cluster ID set
0098   _cluster_ids.clear();
0099   std::copy(source.begin_clusters(), source.end_clusters(), std::inserter(_cluster_ids, _cluster_ids.begin()));
0100 
0101   // copy over cluster key set
0102   _cluster_keys.clear();
0103   std::copy(source.begin_cluster_keys(), source.end_cluster_keys(), std::inserter(_cluster_keys, _cluster_keys.begin()));
0104 
0105   // copy over calorimeter projections
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   // find closest iterator
0223   const auto pathlength = state->get_pathlength();
0224   auto iterator = _states.lower_bound(pathlength);
0225   if (iterator == _states.end() || pathlength < iterator->first)
0226   {
0227     // pathlength not found. Make a copy and insert
0228     const auto copy = static_cast<SvtxTrackState*>(state->CloneMe());
0229     iterator = _states.insert(iterator, std::make_pair(pathlength, copy));
0230   }
0231 
0232   // return matching state
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 }