Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-07-16 08:14:51

0001 #include "PHTrackTrackSeedSynchronization.h"
0002 
0003 /// Tracking includes
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 * /*unused*/)
0058 {
0059   // loop over tracks and synchronize
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     // silicon seed
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     // tpc seed
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 * /*unused*/)
0096 { return Fun4AllReturnCodes::EVENT_OK; }
0097 
0098 //__________________________________________________________________________________
0099 int PHTrackTrackSeedSynchronization::GetNodes(PHCompositeNode *topNode)
0100 {
0101 
0102   // tracks
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   // silicon seeds
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   // tpc seeds
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   // perform quick search
0134   const size_t index = container->find( source );
0135   if( index < container->size() ) return index;
0136 
0137   // perform deep search based on cluster keys
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   // get cluster key set from seed
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   // error
0170   std::cout << "PHTrackTrackSeedSynchronization::find_seed_id - could not find seed " << source << " in container " << container << std::endl;
0171   return container->size();
0172 }