Back to home page

sPhenix code displayed by LXR

 
 

    


Warning, /coresoftware/offline/packages/trackreco/PHHybridSeeding.cc.outdated is written in an unsupported language. File is not indexed.

0001 /*!
0002  *  \file PHHybridSeeding.cc
0003  *  \brief Track Seeding using STAR "CA" algorithm and ALICE simplified Kalman filter
0004  *  \detail 
0005  *  \author Michael Peters & Christof Roland
0006  */
0007 
0008 #include "PHHybridSeeding.h"
0009 #include "GPUTPCTrackLinearisation.h"
0010 #include "GPUTPCTrackParam.h"
0011 
0012 #include "../PHTpcTracker/externals/kdfinder.hpp"
0013 #include "../PHTpcTracker/PHTpcTrackerUtil.h"
0014 
0015 // trackbase_historic includes
0016 #include <trackbase_historic/SvtxTrackMap.h>
0017 #include <trackbase_historic/SvtxTrack_v3.h>
0018 #include <trackbase_historic/SvtxTrack.h>
0019 #include <globalvertex/SvtxVertex.h>
0020 #include <globalvertex/SvtxVertexMap.h>
0021 
0022 #include <trackbase/TrkrCluster.h>  // for TrkrCluster
0023 #include <trackbase/TrkrClusterContainer.h>
0024 #include <trackbase/TrkrDefs.h>  // for getLayer, clu...
0025 
0026 // sPHENIX Geant4 includes
0027 #include <g4detectors/PHG4TpcCylinderGeom.h>
0028 #include <g4detectors/PHG4TpcCylinderGeomContainer.h>
0029 #include <g4detectors/PHG4CylinderGeom.h>
0030 #include <g4detectors/PHG4CylinderGeomContainer.h>
0031 
0032 // sPHENIX includes
0033 #include <fun4all/Fun4AllReturnCodes.h>
0034 
0035 #include <phool/PHTimer.h>  // for PHTimer
0036 #include <phool/getClass.h>
0037 #include <phool/phool.h>  // for PHWHERE
0038 
0039 //ROOT includes
0040 #include <TVector3.h>  // for TVector3
0041 #include <TFile.h>
0042 #include <TNtuple.h>
0043 
0044 #include <Eigen/Core>
0045 #include <Eigen/Dense>
0046 
0047 #include <algorithm>
0048 #include <cmath>
0049 #include <iostream>
0050 #include <numeric>
0051 #include <utility>  // for pair, make_pair
0052 #include <vector>
0053 #include <algorithm> // for find
0054 #include <unordered_set>
0055 
0056 // forward declarations
0057 class PHCompositeNode;
0058 
0059 #define _DEBUG_
0060 
0061 #if defined(_DEBUG_)
0062 #define LogDebug(exp) std::cout << "DEBUG: " << __FILE__ << ": " << __LINE__ << ": " << exp
0063 #else
0064 #define LogDebug(exp) (void)0
0065 #endif
0066 
0067 #define LogError(exp) std::cout << "ERROR: " << __FILE__ << ": " << __LINE__ << ": " << exp
0068 #define LogWarning(exp) std::cout << "WARNING: " << __FILE__ << ": " << __LINE__ << ": " << exp
0069 
0070 //end
0071 
0072 typedef std::vector<TrkrDefs::cluskey> keylist;
0073 using namespace std;
0074 
0075 PHHybridSeeding::PHHybridSeeding(
0076     const string &name,
0077     double maxSinPhi,
0078     double fieldDir,
0079     double search_radius1,
0080     double search_angle1,
0081     size_t min_track_size1,
0082     double search_radius2,
0083     double search_angle2,
0084     size_t min_track_size2,
0085     size_t nthreads
0086     )
0087   : PHTrackSeeding(name)
0088   , _max_sin_phi(maxSinPhi)
0089   , _fieldDir(fieldDir)
0090   , _search_radius1(search_radius1)
0091   , _search_angle1(search_angle1)
0092   , _min_track_size1(min_track_size1)
0093   , _search_radius2(search_radius2)
0094   , _search_angle2(search_angle2)
0095   , _min_track_size2(min_track_size2)
0096   , _nthreads(nthreads)
0097 {
0098 }
0099 
0100 int PHHybridSeeding::InitializeGeometry(PHCompositeNode *topNode)
0101 {
0102   PHG4TpcCylinderGeomContainer *cellgeos = findNode::getClass<
0103       PHG4TpcCylinderGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0104   PHG4CylinderGeomContainer *laddergeos = findNode::getClass<
0105       PHG4CylinderGeomContainer>(topNode, "CYLINDERGEOM_INTT");
0106   PHG4CylinderGeomContainer *mapsladdergeos = findNode::getClass<
0107       PHG4CylinderGeomContainer>(topNode, "CYLINDERGEOM_MVTX");
0108 
0109   //_nlayers_seeding = _seeding_layer.size();
0110   //_radii.assign(_nlayers_seeding, 0.0);
0111   map<double, int> radius_layer_map;
0112 
0113   _radii_all.assign(60, 0.0);
0114   _layer_ilayer_map.clear();
0115   _layer_ilayer_map_all.clear();
0116   if (cellgeos)
0117   {
0118     PHG4TpcCylinderGeomContainer::ConstRange layerrange =
0119         cellgeos->get_begin_end();
0120     for (PHG4TpcCylinderGeomContainer::ConstIterator layeriter =
0121              layerrange.first;
0122          layeriter != layerrange.second; ++layeriter)
0123     {
0124       radius_layer_map.insert(
0125           make_pair(layeriter->second->get_radius(),
0126                     layeriter->second->get_layer()));
0127     }
0128   }
0129 
0130   if (laddergeos)
0131   {
0132     PHG4CylinderGeomContainer::ConstRange layerrange =
0133         laddergeos->get_begin_end();
0134     for (PHG4CylinderGeomContainer::ConstIterator layeriter =
0135              layerrange.first;
0136          layeriter != layerrange.second; ++layeriter)
0137     {
0138       radius_layer_map.insert(
0139           make_pair(layeriter->second->get_radius(),
0140                     layeriter->second->get_layer()));
0141     }
0142   }
0143 
0144   if (mapsladdergeos)
0145   {
0146     PHG4CylinderGeomContainer::ConstRange layerrange =
0147         mapsladdergeos->get_begin_end();
0148     for (PHG4CylinderGeomContainer::ConstIterator layeriter =
0149              layerrange.first;
0150          layeriter != layerrange.second; ++layeriter)
0151     {
0152       radius_layer_map.insert(
0153           make_pair(layeriter->second->get_radius(),
0154                     layeriter->second->get_layer()));
0155     }
0156   }
0157   for (map<double, int>::iterator iter = radius_layer_map.begin();
0158        iter != radius_layer_map.end(); ++iter)
0159   {
0160     _layer_ilayer_map_all.insert(make_pair(iter->second, _layer_ilayer_map_all.size()));
0161 
0162     /*if (std::find(_seeding_layer.begin(), _seeding_layer.end(),
0163                   iter->second) != _seeding_layer.end())
0164     {
0165       _layer_ilayer_map.insert(make_pair(iter->second, ilayer));
0166       ++ilayer;
0167       }*/
0168   }
0169   if (cellgeos)
0170   {
0171     PHG4TpcCylinderGeomContainer::ConstRange begin_end =
0172         cellgeos->get_begin_end();
0173     PHG4TpcCylinderGeomContainer::ConstIterator miter = begin_end.first;
0174     for (; miter != begin_end.second; ++miter)
0175     {
0176       PHG4TpcCylinderGeom *geo = miter->second;
0177       _radii_all[_layer_ilayer_map_all[geo->get_layer()]] =
0178           geo->get_radius() + 0.5 * geo->get_thickness();
0179 
0180       /*if (_layer_ilayer_map.find(geo->get_layer()) != _layer_ilayer_map.end())
0181       {
0182         _radii[_layer_ilayer_map[geo->get_layer()]] =
0183             geo->get_radius();
0184             }*/
0185     }
0186   }
0187 
0188   if (laddergeos)
0189   {
0190     PHG4CylinderGeomContainer::ConstRange begin_end =
0191         laddergeos->get_begin_end();
0192     PHG4CylinderGeomContainer::ConstIterator miter = begin_end.first;
0193     for (; miter != begin_end.second; ++miter)
0194     {
0195       PHG4CylinderGeom *geo = miter->second;
0196       _radii_all[_layer_ilayer_map_all[geo->get_layer()]] =
0197           geo->get_radius() + 0.5 * geo->get_thickness();
0198 
0199       /*if (_layer_ilayer_map.find(geo->get_layer()) != _layer_ilayer_map.end())
0200       {
0201         _radii[_layer_ilayer_map[geo->get_layer()]] = geo->get_radius();
0202         }*/
0203     }
0204   }
0205 
0206   if (mapsladdergeos)
0207   {
0208     PHG4CylinderGeomContainer::ConstRange begin_end =
0209         mapsladdergeos->get_begin_end();
0210     PHG4CylinderGeomContainer::ConstIterator miter = begin_end.first;
0211     for (; miter != begin_end.second; ++miter)
0212     {
0213       PHG4CylinderGeom *geo = miter->second;
0214 
0215       //if(geo->get_layer() > (int) _radii.size() ) continue;
0216 
0217       //                        if (Verbosity() >= 2)
0218       //                                geo->identify();
0219 
0220       //TODO
0221       _radii_all[_layer_ilayer_map_all[geo->get_layer()]] =
0222           geo->get_radius();
0223 
0224       /*if (_layer_ilayer_map.find(geo->get_layer()) != _layer_ilayer_map.end())
0225       {
0226         _radii[_layer_ilayer_map[geo->get_layer()]] = geo->get_radius();
0227         }*/
0228     }
0229   }
0230   return Fun4AllReturnCodes::EVENT_OK;
0231 }
0232 
0233 int PHHybridSeeding::Process(PHCompositeNode */*topNode*/)
0234 {
0235   // wipe previous vertex coordinates
0236   _vertex_x.clear();
0237   _vertex_y.clear();
0238   _vertex_z.clear();
0239   _vertex_xerr.clear();
0240   _vertex_yerr.clear();
0241   _vertex_zerr.clear();
0242   _vertex_ids.clear();
0243   // fill new vertex coordinates
0244   for(map<unsigned int, SvtxVertex*>::iterator iter = _vertex_map->begin(); iter != _vertex_map->end(); ++iter)
0245   {
0246     SvtxVertex* v = dynamic_cast<SvtxVertex*>(iter->second->CloneMe());
0247     _vertex_x.push_back(v->get_x());
0248     _vertex_y.push_back(v->get_y());
0249     _vertex_z.push_back(v->get_z());
0250     _vertex_xerr.push_back(sqrt(v->get_error(0,0)));
0251     _vertex_yerr.push_back(sqrt(v->get_error(1,1)));
0252     _vertex_zerr.push_back(sqrt(v->get_error(2,2)));
0253     _vertex_ids.push_back(v->get_id());
0254   }
0255   if(Verbosity()>1) cout << "vertices:\n";
0256   for(size_t i=0;i<_vertex_x.size();i++)
0257   {
0258     if(Verbosity()>1) cout << "(" << _vertex_x[i] << "," << _vertex_y[i] << "," << _vertex_z[i] << ")\n";
0259   }
0260   vector<vector<double>> kdhits(PHTpcTrackerUtil::convert_clusters_to_hits(_cluster_map,_hitsets));
0261   vector<vector<double> > unused_hits;
0262   vector<vector<vector<double> > > kdtracks;
0263 
0264   bool print_stats = (Verbosity()>0);
0265 
0266   kdtracks = kdfinder::find_tracks_iterative<double>(kdhits, unused_hits,
0267                                                      _search_radius1, /* max distance in cm*/
0268                                                      _search_angle1, /* triplet angle */
0269                                                      _min_track_size1, /* min hits to keep track */
0270                                                      // first iteration
0271                                                      _search_radius2, 
0272                                                      _search_angle2, 
0273                                                      _min_track_size2,                                                                           // second iteration params
0274                                                      _nthreads,
0275                                                      print_stats);
0276   if(Verbosity()>0) cout << "n_kdtracks: " << kdtracks.size() << "\n";
0277   vector<keylist> clusterLists;
0278   for(auto track : kdtracks)
0279   {
0280     keylist k;
0281     for(auto kdhit : track)
0282     {
0283       // see PHTpcTracker/PHTpcTrackerUtil.cc; this recovers the cluster key, apparently
0284        k.push_back(*((int64_t*)&kdhit[3])); 
0285     }
0286     clusterLists.push_back(k);
0287   }
0288   for(auto& clist : clusterLists)
0289   {
0290     if(Verbosity()>1) cout << "front layer: " << (int)TrkrDefs::getLayer(clist.front()) << " back layer: " << (int)TrkrDefs::getLayer(clist.back());
0291     if(clist.size()>1 && ((int)TrkrDefs::getLayer(clist.front()))<((int)TrkrDefs::getLayer(clist.back())))
0292     {
0293       if(Verbosity()>1) cout << "reversing\n";
0294       std::reverse(clist.begin(),clist.end());
0295     }
0296     if(Verbosity()>1) cout << "final layer order:\n";
0297     for(auto c : clist) if(Verbosity()>1) cout << (int)TrkrDefs::getLayer(c) << endl;
0298   }
0299   for(auto clist : clusterLists)
0300   {
0301     if(Verbosity()>1) cout << "layers:\n";
0302     for(auto c : clist)
0303     {
0304       if(Verbosity()>1) cout << (int)TrkrDefs::getLayer(c) << endl;
0305     }
0306   }
0307   vector<SvtxTrack_v3> seeds = fitter->ALICEKalmanFilter(clusterLists,false);
0308   if(Verbosity()>0) cout << "nseeds: " << seeds.size() << "\n";
0309   publishSeeds(seeds);
0310   return Fun4AllReturnCodes::EVENT_OK;
0311 }
0312 
0313 void PHHybridSeeding::publishSeeds(vector<SvtxTrack_v3> seeds)
0314 {
0315   for(size_t i=0;i<seeds.size();i++)
0316   {
0317     _track_map->insert(&(seeds[i]));
0318   }
0319 }
0320 
0321 int PHHybridSeeding::Setup(PHCompositeNode *topNode)
0322 {
0323   if(Verbosity()>0) cout << "Called Setup" << endl;
0324   if(Verbosity()>0) cout << "topNode:" << topNode << endl;
0325   PHTrackSeeding::Setup(topNode);
0326 
0327   _vertex_map = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0328   if (!_vertex_map)
0329     {
0330       cerr << PHWHERE << " ERROR: Can't find SvtxVertexMap." << endl;
0331       return Fun4AllReturnCodes::ABORTEVENT;
0332     }
0333   
0334   auto surfmaps = findNode::getClass<ActsSurfaceMaps>(topNode, "ActsSurfaceMaps");
0335   if(!surfmaps)
0336     {
0337       std::cout << "No Acts surface maps, bailing." << std::endl;
0338       return Fun4AllReturnCodes::ABORTEVENT;
0339     }
0340 
0341   auto tGeometry = findNode::getClass<ActsTrackingGeometry>(topNode,"ActsTrackingGeometry");
0342   if(!tGeometry)
0343     {
0344       std::cout << "No Acts tracking geometry, exiting." << std::endl;
0345       return Fun4AllReturnCodes::ABORTEVENT;
0346     }
0347 
0348   InitializeGeometry(topNode);
0349   fitter = std::make_shared<ALICEKF>(topNode,_cluster_map,surfmaps, tGeometry,
0350                                      _fieldDir,_min_fit_track_size,_max_sin_phi,Verbosity()); 
0351   return Fun4AllReturnCodes::EVENT_OK;
0352 }
0353 
0354 int PHHybridSeeding::End()
0355 {
0356   if(Verbosity()>0) cout << "Called End " << endl;
0357   return Fun4AllReturnCodes::EVENT_OK;
0358 }