File indexing completed on 2026-07-16 08:14:51
0001 #include "PHTrackTrackSeedSynchronization.h"
0002
0003
0004 #include <trackbase/MvtxDefs.h>
0005 #include <trackbase/TrackFitUtils.h>
0006 #include <trackbase/TpcDefs.h>
0007 #include <trackbase/TrkrClusterContainer.h>
0008 #include <trackbase/TrkrClusterv3.h>
0009 #include <trackbase/TrkrDefs.h> // for cluskey, getTrkrId, tpcId
0010
0011 #include <trackbase_historic/SvtxTrackSeed_v2.h>
0012 #include <trackbase_historic/TrackSeedContainer_v1.h>
0013 #include <trackbase_historic/TrackSeed_v2.h>
0014 #include <trackbase_historic/TrackSeedHelper.h>
0015
0016 #include <trackbase_historic/SvtxTrack.h> // for SvtxTrack
0017 #include <trackbase_historic/SvtxTrackMap.h>
0018
0019 #include <fun4all/Fun4AllReturnCodes.h>
0020
0021 #include <phool/PHCompositeNode.h>
0022 #include <phool/getClass.h>
0023 #include <phool/phool.h>
0024 #include <phool/sphenix_constants.h>
0025
0026 #include <TF1.h>
0027 #include <TFile.h>
0028 #include <TNtuple.h>
0029
0030 #include <climits> // for UINT_MAX
0031 #include <cmath> // for fabs, sqrt
0032 #include <iostream> // for operator<<, basic_ostream
0033 #include <memory>
0034 #include <set> // for _Rb_tree_const_iterator
0035 #include <utility> // for pair
0036
0037 using namespace std;
0038
0039
0040 PHTrackTrackSeedSynchronization::PHTrackTrackSeedSynchronization(const std::string &name)
0041 : SubsysReco(name)
0042 {}
0043
0044
0045 int PHTrackTrackSeedSynchronization::InitRun(PHCompositeNode *topNode)
0046 {
0047 int ret = GetNodes(topNode);
0048 if (ret != Fun4AllReturnCodes::EVENT_OK)
0049 {
0050 return ret;
0051 }
0052
0053 return ret;
0054 }
0055
0056
0057 int PHTrackTrackSeedSynchronization::process_event(PHCompositeNode * )
0058 {
0059
0060 for( auto &&[key,track]:*_svtx_track_map )
0061 { synchronize_track(track); }
0062
0063 return Fun4AllReturnCodes::EVENT_OK;
0064 }
0065
0066
0067 bool PHTrackTrackSeedSynchronization::synchronize_track( SvtxTrack* track ) const
0068 {
0069 {
0070
0071 auto* seed = track->get_silicon_seed();
0072 if( seed )
0073 {
0074 auto index = find_seed_id( _si_seed_map, seed );
0075 if( index < _si_seed_map->size() )
0076 { track->set_silicon_seed( _si_seed_map->get(index)); }
0077 }
0078 }
0079
0080 {
0081
0082 auto* seed = track->get_tpc_seed();
0083 if( seed )
0084 {
0085 auto index = find_seed_id( _tpc_seed_map, seed );
0086 if( index < _tpc_seed_map->size() )
0087 { track->set_tpc_seed( _tpc_seed_map->get(index)); }
0088 }
0089 }
0090
0091 return true;
0092 }
0093
0094
0095 int PHTrackTrackSeedSynchronization::End(PHCompositeNode * )
0096 { return Fun4AllReturnCodes::EVENT_OK; }
0097
0098
0099 int PHTrackTrackSeedSynchronization::GetNodes(PHCompositeNode *topNode)
0100 {
0101
0102
0103 _svtx_track_map = findNode::getClass<SvtxTrackMap>(topNode, _svtx_track_map_name);
0104 if (!_svtx_track_map)
0105 {
0106 cerr << "PHTrackTrackSeedSynchronization::GetNodes - " << _svtx_track_map_name << " not found on the node tree." << endl;
0107 return Fun4AllReturnCodes::ABORTEVENT;
0108 }
0109
0110
0111 _si_seed_map = findNode::getClass<TrackSeedContainer>(topNode, _si_seed_map_name);
0112 if (!_si_seed_map)
0113 {
0114 cerr << "PHTrackTrackSeedSynchronization::GetNodes - " << _si_seed_map_name << " not found on the node tree." << endl;
0115 return Fun4AllReturnCodes::ABORTEVENT;
0116 }
0117
0118
0119 _tpc_seed_map = findNode::getClass<TrackSeedContainer>(topNode, _tpc_seed_map_name);
0120 if (!_tpc_seed_map)
0121 {
0122 cerr << "PHTrackTrackSeedSynchronization::GetNodes - " << _tpc_seed_map_name << " not found on the node tree." << endl;
0123 return Fun4AllReturnCodes::ABORTEVENT;
0124 }
0125
0126 return Fun4AllReturnCodes::EVENT_OK;
0127 }
0128
0129
0130
0131 size_t PHTrackTrackSeedSynchronization::find_seed_id( TrackSeedContainer* container, TrackSeed* source ) const
0132 {
0133
0134 const size_t index = container->find( source );
0135 if( index < container->size() ) return index;
0136
0137
0138 if( Verbosity() )
0139 { std::cout << "PHTrackTrackSeedSynchronization::find_seed_id - performing deep search for seed " << source << " in container " << container << std::endl; }
0140
0141 using cluster_keyset_t=std::set<TrkrDefs::cluskey>;
0142
0143
0144 auto get_cluster_keyset = [this]( TrackSeed* seed )
0145 {
0146 cluster_keyset_t ckeys;
0147 if( m_ignore_micromegas )
0148 {
0149 std::copy_if( seed->begin_cluster_keys(), seed->end_cluster_keys(), std::inserter(ckeys, ckeys.end() ),
0150 []( const TrkrDefs::cluskey& ckey ) { return TrkrDefs::getTrkrId(ckey) != TrkrDefs::micromegasId; } );
0151 } else {
0152 std::copy( seed->begin_cluster_keys(), seed->end_cluster_keys(), std::inserter(ckeys, ckeys.end() ) );
0153 }
0154 return ckeys;
0155
0156 };
0157
0158 const auto source_ckeys = get_cluster_keyset( source );
0159 for( size_t i = 0; i < container->size(); ++i )
0160 {
0161 auto* seed = container->get(i);
0162 if( !seed ) continue;
0163
0164 const auto ckeys = get_cluster_keyset( seed );
0165 if( ckeys == source_ckeys )
0166 { return i; }
0167 }
0168
0169
0170 std::cout << "PHTrackTrackSeedSynchronization::find_seed_id - could not find seed " << source << " in container " << container << std::endl;
0171 return container->size();
0172 }