Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:21:48

0001 #include "SvtxEvaluator.h"
0002 
0003 #include "SvtxClusterEval.h"
0004 #include "SvtxEvalStack.h"
0005 #include "SvtxHitEval.h"
0006 #include "SvtxTrackEval.h"
0007 #include "SvtxTruthEval.h"
0008 #include "SvtxVertexEval.h"
0009 
0010 #include <trackbase/ActsGeometry.h>
0011 #include <trackbase/ClusterErrorPara.h>
0012 #include <trackbase/TpcDefs.h>
0013 #include <trackbase/TrkrCluster.h>
0014 #include <trackbase/TrkrClusterContainer.h>
0015 #include <trackbase/TrkrClusterHitAssoc.h>
0016 #include <trackbase/TrkrClusterIterationMapv1.h>
0017 #include <trackbase/TrkrDefs.h>
0018 #include <trackbase/TrkrHit.h>
0019 #include <trackbase/TrkrHitSet.h>
0020 #include <trackbase/TrkrHitSetContainer.h>
0021 
0022 #include <trackbase_historic/ActsTransformations.h>
0023 #include <trackbase_historic/SvtxTrack.h>
0024 #include <trackbase_historic/SvtxTrackMap.h>
0025 #include <trackbase_historic/TrackAnalysisUtils.h>
0026 #include <trackbase_historic/TrackSeed.h>
0027 
0028 #include <globalvertex/GlobalVertex.h>
0029 #include <globalvertex/GlobalVertexMap.h>
0030 #include <globalvertex/SvtxVertex.h>
0031 #include <globalvertex/SvtxVertexMap.h>
0032 
0033 #include <g4main/PHG4Hit.h>
0034 #include <g4main/PHG4Particle.h>
0035 #include <g4main/PHG4TruthInfoContainer.h>
0036 #include <g4main/PHG4VtxPoint.h>
0037 
0038 #include <g4detectors/PHG4TpcGeom.h>
0039 #include <g4detectors/PHG4TpcGeomContainer.h>
0040 
0041 #include <fun4all/Fun4AllReturnCodes.h>
0042 #include <fun4all/SubsysReco.h>
0043 
0044 #include <phool/PHTimer.h>
0045 #include <phool/getClass.h>
0046 #include <phool/phool.h>
0047 #include <phool/recoConsts.h>
0048 
0049 #include <TFile.h>
0050 #include <TNtuple.h>
0051 #include <TVector3.h>
0052 
0053 #include <algorithm>
0054 #include <cmath>
0055 #include <iomanip>
0056 #include <iostream>
0057 #include <iterator>
0058 #include <map>
0059 #include <memory>  // for shared_ptr
0060 #include <set>     // for _Rb_tree_cons...
0061 #include <utility>
0062 #include <vector>
0063 
0064 SvtxEvaluator::SvtxEvaluator(const std::string& /*name*/, const std::string& filename, const std::string& trackmapname,
0065                              unsigned int nlayers_maps,
0066                              unsigned int nlayers_intt,
0067                              unsigned int nlayers_tpc,
0068                              unsigned int nlayers_mms)
0069   : SubsysReco("SvtxEvaluator")
0070   , _nlayers_maps(nlayers_maps)
0071   , _nlayers_intt(nlayers_intt)
0072   , _nlayers_tpc(nlayers_tpc)
0073   , _nlayers_mms(nlayers_mms)
0074   , _filename(filename)
0075   , _trackmapname(trackmapname)
0076 {
0077 }
0078 
0079 SvtxEvaluator::~SvtxEvaluator()
0080 {
0081   delete _timer;
0082 }
0083 
0084 int SvtxEvaluator::Init(PHCompositeNode* /*topNode*/)
0085 {
0086   _ievent = 0;
0087 
0088   _tfile = new TFile(_filename.c_str(), "RECREATE");
0089   _tfile->SetCompressionLevel(0);
0090   if (_do_info_eval)
0091   {
0092     _ntp_info = new TNtuple("ntp_info", "event info",
0093                             "event:seed:"
0094                             "occ11:occ116:occ21:occ216:occ31:occ316:"
0095                             "gntrkall:gntrkprim:ntrk:"
0096                             "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0097   }
0098 
0099   if (_do_vertex_eval)
0100   {
0101     _ntp_vertex = new TNtuple("ntp_vertex", "vertex => max truth",
0102                               "event:seed:vertexID:vx:vy:vz:ntracks:chi2:ndof:"
0103                               "gvx:gvy:gvz:gvt:gembed:gntracks:gntracksmaps:"
0104                               "gnembed:nfromtruth:"
0105                               "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0106   }
0107 
0108   if (_do_gpoint_eval)
0109   {
0110     _ntp_gpoint = new TNtuple("ntp_gpoint", "g4point => best vertex",
0111                               "event:seed:gvx:gvy:gvz:gvt:gntracks:gembed:"
0112                               "vx:vy:vz:ntracks:"
0113                               "nfromtruth:"
0114                               "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0115   }
0116 
0117   if (_do_g4hit_eval)
0118   {
0119     _ntp_g4hit = new TNtuple("ntp_g4hit", "g4hit => best svtxcluster",
0120                              "event:seed:g4hitID:gx:gy:gz:gt:gpl:gedep:geta:gphi:"
0121                              "gdphi:gdz:"
0122                              "glayer:gtrackID:gflavor:"
0123                              "gpx:gpy:gpz:"
0124                              "gvx:gvy:gvz:"
0125                              "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0126                              "gembed:gprimary:nclusters:"
0127                              "clusID:x:y:z:eta:phi:e:adc:layer:size:"
0128                              "efromtruth:dphitru:detatru:dztru:drtru:"
0129                              "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0130   }
0131 
0132   if (_do_hit_eval)
0133   {
0134     _ntp_hit = new TNtuple("ntp_hit", "svtxhit => max truth",
0135                            "event:seed:hitID:e:adc:layer:phielem:zelem:"
0136                            "cellID:ecell:phibin:zbin:phi:x:y:z:"
0137                            "g4hitID:gedep:gx:gy:gz:gt:"
0138                            "gtrackID:gflavor:"
0139                            "gpx:gpy:gpz:gvx:gvy:gvz:gvt:"
0140                            "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0141                            "gembed:gprimary:efromtruth:"
0142                            "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0143   }
0144 
0145   if (_do_cluster_eval)
0146   {
0147     _ntp_cluster = new TNtuple("ntp_cluster", "svtxcluster => max truth",
0148                                "event:seed:hitID:x:y:z:r:phi:eta:theta:ex:ey:ez:ephi:pez:pephi:"
0149                                "e:adc:maxadc:layer:phielem:zelem:size:phisize:zsize:"
0150                                "pedge:redge:ovlp:"
0151                                "trackID:niter:g4hitID:gx:"
0152                                "gy:gz:gr:gphi:geta:gt:gtrackID:gflavor:"
0153                                "gpx:gpy:gpz:gvx:gvy:gvz:gvt:"
0154                                "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0155                                "gembed:gprimary:efromtruth:nparticles:"
0156                                "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0157   }
0158 
0159   if (_do_g4cluster_eval)
0160   {
0161     _ntp_g4cluster = new TNtuple("ntp_g4cluster", "g4cluster => max truth",
0162                                  "event:layer:gx:gy:gz:gt:gedep:gr:gphi:geta:gtrackID:gflavor:gembed:gprimary:gphisize:gzsize:gadc:nreco:x:y:z:r:phi:eta:ex:ey:ez:ephi:adc:phisize:zsize");
0163   }
0164 
0165   if (_do_gtrack_eval)
0166   {
0167     _ntp_gtrack = new TNtuple("ntp_gtrack", "g4particle => best svtxtrack",
0168                               "event:seed:gntracks:gnchghad:gtrackID:gflavor:gnhits:gnmaps:gnintt:gnmms:"
0169                               "gnintt1:gnintt2:gnintt3:gnintt4:"
0170                               "gnintt5:gnintt6:gnintt7:gnintt8:"
0171                               "gntpc:gnlmaps:gnlintt:gnltpc:gnlmms:"
0172                               "gpx:gpy:gpz:gpt:geta:gphi:"
0173                               "gvx:gvy:gvz:gvt:"
0174                               "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0175                               "gembed:gprimary:"
0176                               "trackID:px:py:pz:pt:eta:phi:deltapt:deltaeta:deltaphi:"
0177                               "siqr:siphi:sithe:six0:siy0:tpqr:tpphi:tpthe:tpx0:tpy0:"
0178                               "charge:quality:chisq:ndf:nhits:layers:nmaps:nintt:ntpc:nmms:ntpc1:ntpc11:ntpc2:ntpc3:nlmaps:nlintt:nltpc:nlmms:"
0179                               "vertexID:vx:vy:vz:dca2d:dca2dsigma:dca3dxy:dca3dxysigma:dca3dz:dca3dzsigma:pcax:pcay:pcaz:nfromtruth:nwrong:ntrumaps:nwrongmaps:ntruintt:nwrongintt:ntrutpc:nwrongtpc:ntrumms:nwrongmms:ntrutpc1:nwrongtpc1:ntrutpc11:nwrongtpc11:ntrutpc2:nwrongtpc2:ntrutpc3:nwrongtpc3:layersfromtruth:"
0180                               "npedge:nredge:nbig:novlp:merr:msize:"
0181                               "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0182   }
0183 
0184   if (_do_track_eval)
0185   {
0186     _ntp_track = new TNtuple("ntp_track", "svtxtrack => max truth",
0187                              "event:seed:trackID:crossing:px:py:pz:pt:eta:phi:deltapt:deltaeta:deltaphi:"
0188                              "siqr:siphi:sithe:six0:siy0:tpqr:tpphi:tpthe:tpx0:tpy0:"
0189                              "charge:quality:chisq:ndf:nhits:nmaps:nintt:ntpc:nmms:ntpc1:ntpc11:ntpc2:ntpc3:nlmaps:nlintt:nltpc:nlmms:layers:"
0190                              "vertexID:vx:vy:vz:dca2d:dca2dsigma:dca3dxy:dca3dxysigma:dca3dz:dca3dzsigma:pcax:pcay:pcaz:"
0191                              "gtrackID:singlematch:gflavor:gnhits:gnmaps:gnintt:gntpc:gnmms:gnlmaps:gnlintt:gnltpc:gnlmms:"
0192                              "gpx:gpy:gpz:gpt:geta:gphi:"
0193                              "gvx:gvy:gvz:gvt:"
0194                              "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0195                              "gembed:gprimary:nfromtruth:nwrong:ntrumaps:nwrongmaps:ntruintt:nwrongintt:"
0196                              "ntrutpc:nwrongtpc:ntrumms:nwrongmms:ntrutpc1:nwrongtpc1:ntrutpc11:nwrongtpc11:ntrutpc2:nwrongtpc2:ntrutpc3:nwrongtpc3:layersfromtruth:"
0197                              "npedge:nredge:nbig:novlp:merr:msize:"
0198                              "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0199   }
0200 
0201   if (_do_gseed_eval)
0202   {
0203     _ntp_gseed = new TNtuple("ntp_gseed", "seeds from truth",
0204                              "event:seed:ntrk:gx:gy:gz:gr:geta:gphi:"
0205                              "glayer:"
0206                              "gpx:gpy:gpz:gtpt:gtphi:gteta:"
0207                              "gvx:gvy:gvz:"
0208                              "gembed:gprimary:gflav:"
0209                              "dphiprev:detaprev:"
0210                              "nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclusintt:nclusmaps:nclusmms");
0211   }
0212 
0213   _timer = new PHTimer("_eval_timer");
0214   _timer->stop();
0215 
0216   return Fun4AllReturnCodes::EVENT_OK;
0217 }
0218 
0219 int SvtxEvaluator::InitRun(PHCompositeNode* /*topNode*/)
0220 {
0221   return Fun4AllReturnCodes::EVENT_OK;
0222 }
0223 
0224 int SvtxEvaluator::process_event(PHCompositeNode* topNode)
0225 {
0226   if ((Verbosity() > 1) && (_ievent % 100 == 0))
0227   {
0228     std::cout << "SvtxEvaluator::process_event - Event = " << _ievent << std::endl;
0229   }
0230 
0231   recoConsts* rc = recoConsts::instance();
0232   if (rc->FlagExist("RANDOMSEED"))
0233   {
0234     _iseed = rc->get_IntFlag("RANDOMSEED");
0235     m_fSeed = _iseed;
0236   }
0237   else
0238   {
0239     _iseed = 0;
0240     m_fSeed = std::numeric_limits<float>::quiet_NaN();
0241   }
0242 
0243   if (Verbosity() > 1)
0244   {
0245     std::cout << "SvtxEvaluator::process_event - Seed = " << _iseed << std::endl;
0246   }
0247 
0248   if (!_svtxevalstack)
0249   {
0250     _svtxevalstack = new SvtxEvalStack(topNode);
0251     _svtxevalstack->set_strict(_strict);
0252     _svtxevalstack->set_verbosity(Verbosity());
0253     _svtxevalstack->set_use_initial_vertex(_use_initial_vertex);
0254     _svtxevalstack->set_use_genfit_vertex(_use_genfit_vertex);
0255     _svtxevalstack->next_event(topNode);
0256   }
0257   else
0258   {
0259     _svtxevalstack->next_event(topNode);
0260   }
0261 
0262   //-----------------------------------
0263   // print what is coming into the code
0264   //-----------------------------------
0265 
0266   printInputInfo(topNode);
0267 
0268   //---------------------------
0269   // fill the Evaluator NTuples
0270   //---------------------------
0271 
0272   fillOutputNtuples(topNode);
0273 
0274   //--------------------------------------------------
0275   // Print out the ancestry information for this event
0276   //--------------------------------------------------
0277 
0278   // printOutputInfo(topNode);
0279 
0280   ++_ievent;
0281   return Fun4AllReturnCodes::EVENT_OK;
0282 }
0283 
0284 int SvtxEvaluator::End(PHCompositeNode* /*topNode*/)
0285 {
0286   _tfile->cd();
0287 
0288   if (_ntp_info)
0289   {
0290     _ntp_info->Write();
0291   }
0292   if (_ntp_vertex)
0293   {
0294     _ntp_vertex->Write();
0295   }
0296   if (_ntp_gpoint)
0297   {
0298     _ntp_gpoint->Write();
0299   }
0300   if (_ntp_g4hit)
0301   {
0302     _ntp_g4hit->Write();
0303   }
0304   if (_ntp_hit)
0305   {
0306     _ntp_hit->Write();
0307   }
0308   if (_ntp_cluster)
0309   {
0310     _ntp_cluster->Write();
0311   }
0312   if (_ntp_g4cluster)
0313   {
0314     _ntp_g4cluster->Write();
0315   }
0316   if (_ntp_gtrack)
0317   {
0318     _ntp_gtrack->Write();
0319   }
0320   if (_ntp_track)
0321   {
0322     _ntp_track->Write();
0323   }
0324   if (_ntp_gseed)
0325   {
0326     _ntp_gseed->Write();
0327   }
0328 
0329   _tfile->Close();
0330 
0331   delete _tfile;
0332 
0333   if (Verbosity() > 1)
0334   {
0335     std::cout << "========================= SvtxEvaluator::End() ============================" << std::endl;
0336     std::cout << " " << _ievent << " events of output written to: " << _filename << std::endl;
0337     std::cout << "===========================================================================" << std::endl;
0338   }
0339 
0340   if (_svtxevalstack)
0341   {
0342     _errors += _svtxevalstack->get_errors();
0343 
0344     if (Verbosity() > 1)
0345     {
0346       if ((_errors > 0) || (Verbosity() > 1))
0347       {
0348         std::cout << "SvtxEvaluator::End() - Error Count: " << _errors << std::endl;
0349       }
0350     }
0351 
0352     delete _svtxevalstack;
0353   }
0354 
0355   return Fun4AllReturnCodes::EVENT_OK;
0356 }
0357 
0358 void SvtxEvaluator::printInputInfo(PHCompositeNode* topNode)
0359 {
0360   if (Verbosity() > 1)
0361   {
0362     std::cout << "SvtxEvaluator::printInputInfo() entered" << std::endl;
0363   }
0364 
0365   if (Verbosity() > 3)
0366   {
0367     // event information
0368     std::cout << std::endl;
0369     std::cout << PHWHERE << "   INPUT FOR EVENT " << _ievent << std::endl;
0370 
0371     std::cout << std::endl;
0372     std::cout << "---PHG4HITS-------------" << std::endl;
0373     _svtxevalstack->get_truth_eval()->set_strict(_strict);
0374     std::set<PHG4Hit*> g4hits = _svtxevalstack->get_truth_eval()->all_truth_hits();
0375     unsigned int ig4hit = 0;
0376     for (std::set<PHG4Hit*>::iterator iter = g4hits.begin();
0377          iter != g4hits.end();
0378          ++iter)
0379     {
0380       PHG4Hit* g4hit = *iter;
0381       std::cout << ig4hit << " of " << g4hits.size();
0382       std::cout << ": PHG4Hit: " << std::endl;
0383       g4hit->identify();
0384       ++ig4hit;
0385     }
0386 
0387     std::cout << "---SVTXCLUSTERS-------------" << std::endl;
0388     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
0389     if (!clustermap)
0390     {
0391       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0392     }
0393 
0394     if (clustermap != nullptr)
0395     {
0396       unsigned int icluster = 0;
0397       for (const auto& hitsetkey : clustermap->getHitSetKeys())
0398       {
0399         auto range = clustermap->getClusters(hitsetkey);
0400         for (auto iter = range.first; iter != range.second; ++iter)
0401         {
0402           TrkrDefs::cluskey cluster_key = iter->first;
0403           std::cout << icluster << " with key " << cluster_key << " of " << clustermap->size();
0404           std::cout << ": SvtxCluster: " << std::endl;
0405           iter->second->identify();
0406           ++icluster;
0407         }
0408       }
0409     }
0410 
0411     std::cout << "---SVXTRACKS-------------" << std::endl;
0412     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
0413     if (trackmap)
0414     {
0415       unsigned int itrack = 0;
0416       for (SvtxTrackMap::Iter iter = trackmap->begin();
0417            iter != trackmap->end();
0418            ++iter)
0419       {
0420         std::cout << itrack << " of " << trackmap->size();
0421         SvtxTrack* track = iter->second;
0422         std::cout << " : SvtxTrack:" << std::endl;
0423         track->identify();
0424         std::cout << std::endl;
0425         ++itrack;
0426       }
0427     }
0428 
0429     std::cout << "---SVXVERTEXES-------------" << std::endl;
0430     SvtxVertexMap* vertexmap = nullptr;
0431     if (_use_initial_vertex)
0432     {
0433       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0434     }
0435     else if (_use_genfit_vertex)
0436     {
0437       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapRefit");
0438     }
0439     else
0440     {
0441       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
0442     }
0443 
0444     if (vertexmap)
0445     {
0446       unsigned int ivertex = 0;
0447       for (SvtxVertexMap::Iter iter = vertexmap->begin();
0448            iter != vertexmap->end();
0449            ++iter)
0450       {
0451         std::cout << ivertex << " of " << vertexmap->size();
0452         SvtxVertex* vertex = iter->second;
0453         std::cout << " : SvtxVertex:" << std::endl;
0454         vertex->identify();
0455         std::cout << std::endl;
0456       }
0457     }
0458   }
0459 
0460   return;
0461 }
0462 
0463 void SvtxEvaluator::printOutputInfo(PHCompositeNode* topNode)
0464 {
0465   if (Verbosity() > 1)
0466   {
0467     std::cout << "SvtxEvaluator::printOutputInfo() entered" << std::endl;
0468   }
0469 
0470   //==========================================
0471   // print out some useful stuff for debugging
0472   //==========================================
0473 
0474   if (Verbosity() > 100)
0475   {
0476     SvtxTrackEval* trackeval = _svtxevalstack->get_track_eval();
0477     SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval();
0478     SvtxTruthEval* trutheval = _svtxevalstack->get_truth_eval();
0479 
0480     // event information
0481     std::cout << std::endl;
0482     std::cout << PHWHERE << "   NEW OUTPUT FOR EVENT " << _ievent << std::endl;
0483     std::cout << std::endl;
0484 
0485     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
0486 
0487     PHG4VtxPoint* gvertex = truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex());
0488     float gvx = gvertex->get_x();
0489     float gvy = gvertex->get_y();
0490     float gvz = gvertex->get_z();
0491 
0492     float vx = std::numeric_limits<float>::quiet_NaN();
0493     float vy = std::numeric_limits<float>::quiet_NaN();
0494     float vz = std::numeric_limits<float>::quiet_NaN();
0495 
0496     SvtxVertexMap* vertexmap = nullptr;
0497     if (_use_initial_vertex)
0498     {
0499       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0500     }
0501     else if (_use_genfit_vertex)
0502     {
0503       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapRefit");
0504     }
0505     else
0506     {
0507       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
0508     }
0509 
0510     if (vertexmap)
0511     {
0512       if (!vertexmap->empty())
0513       {
0514         SvtxVertex* vertex = (vertexmap->begin()->second);
0515 
0516         vx = vertex->get_x();
0517         vy = vertex->get_y();
0518         vz = vertex->get_z();
0519       }
0520     }
0521 
0522     std::cout << "===Vertex Reconstruction=======================" << std::endl;
0523     std::cout << "vtrue = (" << gvx << "," << gvy << "," << gvz << ") => vreco = (" << vx << "," << vy << "," << vz << ")" << std::endl;
0524     std::cout << std::endl;
0525 
0526     std::cout << "===Tracking Summary============================" << std::endl;
0527     unsigned int ng4hits[100] = {0};
0528     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits();
0529     for (auto* g4hit : g4hits)
0530     {
0531       ++ng4hits[g4hit->get_layer()];
0532     }
0533 
0534     TrkrHitSetContainer* hitsetmap = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
0535 
0536     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
0537     if (!clustermap)
0538     {
0539       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0540     }
0541 
0542     unsigned int nclusters[100] = {0};
0543     unsigned int nhits[100] = {0};
0544 
0545     ActsGeometry* tgeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
0546 
0547     if (!tgeometry)
0548     {
0549       std::cout << PHWHERE << "No Acts geometry on node tree. Can't  continue."
0550                 << std::endl;
0551     }
0552 
0553     if (hitsetmap)
0554     {
0555       TrkrHitSetContainer::ConstRange all_hitsets = hitsetmap->getHitSets();
0556       for (TrkrHitSetContainer::ConstIterator hitsetiter = all_hitsets.first;
0557            hitsetiter != all_hitsets.second;
0558            ++hitsetiter)
0559       {
0560         // we have a single hitset, get the layer
0561         unsigned int layer = TrkrDefs::getLayer(hitsetiter->first);
0562 
0563         // count all hits in this hitset
0564         TrkrHitSet::ConstRange hitrangei = hitsetiter->second->getHits();
0565         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
0566              hitr != hitrangei.second;
0567              ++hitr)
0568         {
0569           ++nhits[layer];
0570         }
0571         auto range = clustermap->getClusters(hitsetiter->first);
0572         for (auto clusIter = range.first; clusIter != range.second; ++clusIter)
0573         {
0574           const auto cluskey = clusIter->first;
0575           //        const auto cluster = clusIter->second;
0576           unsigned int local_layer = TrkrDefs::getLayer(cluskey);
0577           nclusters[local_layer]++;
0578         }
0579       }
0580     }
0581 
0582     PHG4TpcGeomContainer* geom_container =
0583         findNode::getClass<PHG4TpcGeomContainer>(topNode, "TPCGEOMCONTAINER");
0584     {
0585       if (!geom_container)
0586       {
0587         std::cout << PHWHERE << "ERROR: Can't find node TPCGEOMCONTAINER" << std::endl;
0588       }
0589       return;
0590     }
0591 
0592     for (unsigned int ilayer = 0; ilayer < _nlayers_maps + _nlayers_intt + _nlayers_tpc; ++ilayer)
0593     {
0594       PHG4TpcGeom* GeoLayer = geom_container->GetLayerCellGeom(ilayer);
0595 
0596       std::cout << "layer " << ilayer << ": nG4hits = " << ng4hits[ilayer]
0597                 << " => nHits = " << nhits[ilayer]
0598                 << " => nClusters = " << nclusters[ilayer] << std::endl;
0599       if (ilayer >= _nlayers_maps + _nlayers_intt && ilayer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0600       {
0601         std::cout << "layer " << ilayer
0602                   << " => nphi = " << GeoLayer->get_phibins()
0603                   << " => nz   = " << GeoLayer->get_zbins()
0604                   << " => ntot = " << GeoLayer->get_phibins() * GeoLayer->get_zbins()
0605                   << std::endl;
0606       }
0607     }
0608 
0609     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
0610 
0611     std::cout << "nGtracks = " << std::distance(truthinfo->GetPrimaryParticleRange().first, truthinfo->GetPrimaryParticleRange().second);
0612     std::cout << " => nTracks = ";
0613     if (trackmap)
0614     {
0615       std::cout << trackmap->size() << std::endl;
0616     }
0617     else
0618     {
0619       std::cout << 0 << std::endl;
0620     }
0621 
0622     // cluster wise information
0623     if (Verbosity() > 1)
0624     {
0625       for (auto* g4hit : g4hits)
0626       {
0627         std::cout << std::endl;
0628         std::cout << "===PHG4Hit===================================" << std::endl;
0629         std::cout << " PHG4Hit: ";
0630         g4hit->identify();
0631 
0632         std::set<TrkrDefs::cluskey> clusters = clustereval->all_clusters_from(g4hit);
0633 
0634         for (unsigned long cluster_key : clusters)
0635         {
0636           std::cout << "===Created-SvtxCluster================" << std::endl;
0637           std::cout << "SvtxCluster: ";
0638           TrkrCluster* cluster = clustermap->findCluster(cluster_key);
0639           cluster->identify();
0640         }
0641       }
0642 
0643       PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange();
0644       for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
0645            iter != range.second;
0646            ++iter)
0647       {
0648         PHG4Particle* particle = iter->second;
0649 
0650         // track-wise information
0651         std::cout << std::endl;
0652 
0653         std::cout << "=== Gtrack ===================================================" << std::endl;
0654         std::cout << " PHG4Particle id = " << particle->get_track_id() << std::endl;
0655         particle->identify();
0656         std::cout << " ptrue = (";
0657         std::cout.width(5);
0658         std::cout << particle->get_px();
0659         std::cout << ",";
0660         std::cout.width(5);
0661         std::cout << particle->get_py();
0662         std::cout << ",";
0663         std::cout.width(5);
0664         std::cout << particle->get_pz();
0665         std::cout << ")" << std::endl;
0666 
0667         std::cout << " vtrue = (";
0668         std::cout.width(5);
0669         std::cout << truthinfo->GetVtx(particle->get_vtx_id())->get_x();
0670         std::cout << ",";
0671         std::cout.width(5);
0672         std::cout << truthinfo->GetVtx(particle->get_vtx_id())->get_y();
0673         std::cout << ",";
0674         std::cout.width(5);
0675         std::cout << truthinfo->GetVtx(particle->get_vtx_id())->get_z();
0676         std::cout << ")" << std::endl;
0677 
0678         std::cout << " pt = " << sqrt(pow(particle->get_px(), 2) + pow(particle->get_py(), 2)) << std::endl;
0679         std::cout << " phi = " << atan2(particle->get_py(), particle->get_px()) << std::endl;
0680         std::cout << " eta = " << asinh(particle->get_pz() / sqrt(pow(particle->get_px(), 2) + pow(particle->get_py(), 2))) << std::endl;
0681 
0682         std::cout << " embed flag = " << truthinfo->isEmbeded(particle->get_track_id()) << std::endl;
0683 
0684         std::cout << " ---Associated-PHG4Hits-----------------------------------------" << std::endl;
0685         std::set<PHG4Hit*> local_g4hits = trutheval->all_truth_hits(particle);
0686         for (auto* g4hit : local_g4hits)
0687         {
0688           float x = 0.5 * (g4hit->get_x(0) + g4hit->get_x(1));
0689           float y = 0.5 * (g4hit->get_y(0) + g4hit->get_y(1));
0690           float z = 0.5 * (g4hit->get_z(0) + g4hit->get_z(1));
0691 
0692           std::cout << " #" << g4hit->get_hit_id() << " xtrue = (";
0693           std::cout.width(5);
0694           std::cout << x;
0695           std::cout << ",";
0696           std::cout.width(5);
0697           std::cout << y;
0698           std::cout << ",";
0699           std::cout.width(5);
0700           std::cout << z;
0701           std::cout << ")";
0702 
0703           std::set<TrkrDefs::cluskey> clusters = clustereval->all_clusters_from(g4hit);
0704           for (unsigned long cluster_key : clusters)
0705           {
0706             TrkrCluster* cluster = clustermap->findCluster(cluster_key);
0707             // auto trkrid = TrkrDefs::getTrkrId(cluster_key);
0708             Acts::Vector3 glob;
0709             glob = tgeometry->getGlobalPosition(cluster_key, cluster);
0710 
0711             float local_x = glob(0);
0712             float local_y = glob(1);
0713             float local_z = glob(2);
0714 
0715             std::cout << " => #" << cluster_key;
0716             std::cout << " xreco = (";
0717             std::cout.width(5);
0718             std::cout << local_x;
0719             std::cout << ",";
0720             std::cout.width(5);
0721             std::cout << local_y;
0722             std::cout << ",";
0723             std::cout.width(5);
0724             std::cout << local_z;
0725             std::cout << ")";
0726           }
0727 
0728           std::cout << std::endl;
0729         }
0730 
0731         if (trackmap && clustermap)
0732         {
0733           std::set<SvtxTrack*> tracks = trackeval->all_tracks_from(particle);
0734           for (auto* track : tracks)
0735           {
0736             float px = track->get_px();
0737             float py = track->get_py();
0738             float pz = track->get_pz();
0739 
0740             std::cout << "===Created-SvtxTrack==========================================" << std::endl;
0741             std::cout << " SvtxTrack id = " << track->get_id() << std::endl;
0742             std::cout << " preco = (";
0743             std::cout.width(5);
0744             std::cout << px;
0745             std::cout << ",";
0746             std::cout.width(5);
0747             std::cout << py;
0748             std::cout << ",";
0749             std::cout.width(5);
0750             std::cout << pz;
0751             std::cout << ")" << std::endl;
0752             std::cout << " quality = " << track->get_quality() << std::endl;
0753             std::cout << " nfromtruth = " << trackeval->get_nclusters_contribution(track, particle) << std::endl;
0754 
0755             std::cout << " ---Associated-SvtxClusters-to-PHG4Hits-------------------------" << std::endl;
0756 
0757             for (SvtxTrack::ConstClusterKeyIter local_iter = track->begin_cluster_keys();
0758                  local_iter != track->end_cluster_keys();
0759                  ++local_iter)
0760             {
0761               TrkrDefs::cluskey cluster_key = *local_iter;
0762               TrkrCluster* cluster = clustermap->findCluster(cluster_key);
0763               // auto trkrid = TrkrDefs::getTrkrId(cluster_key);
0764               Acts::Vector3 glob;
0765               glob = tgeometry->getGlobalPosition(cluster_key, cluster);
0766 
0767               float x = glob(0);
0768               float y = glob(1);
0769               float z = glob(2);
0770 
0771               std::cout << " #" << cluster_key << " xreco = (";
0772               std::cout.width(5);
0773               std::cout << x;
0774               std::cout << ",";
0775               std::cout.width(5);
0776               std::cout << y;
0777               std::cout << ",";
0778               std::cout.width(5);
0779               std::cout << z;
0780               std::cout << ") =>";
0781 
0782               PHG4Hit* g4hit = clustereval->max_truth_hit_by_energy(cluster_key);
0783               if ((g4hit) && (g4hit->get_trkid() == particle->get_track_id()))
0784               {
0785                 x = 0.5 * (g4hit->get_x(0) + g4hit->get_x(1));
0786                 y = 0.5 * (g4hit->get_y(0) + g4hit->get_y(1));
0787                 z = 0.5 * (g4hit->get_z(0) + g4hit->get_z(1));
0788 
0789                 std::cout << " #" << g4hit->get_hit_id()
0790                           << " xtrue = (";
0791                 std::cout.width(5);
0792                 std::cout << x;
0793                 std::cout << ",";
0794                 std::cout.width(5);
0795                 std::cout << y;
0796                 std::cout << ",";
0797                 std::cout.width(5);
0798                 std::cout << z;
0799                 std::cout << ") => Gtrack id = " << g4hit->get_trkid();
0800               }
0801               else
0802               {
0803                 std::cout << " noise hit";
0804               }
0805             }
0806 
0807             std::cout << std::endl;
0808           }
0809         }
0810       }
0811     }
0812 
0813     std::cout << std::endl;
0814 
0815   }  // if Verbosity()
0816 
0817   return;
0818 }
0819 
0820 void SvtxEvaluator::fillOutputNtuples(PHCompositeNode* topNode)
0821 {
0822   if (Verbosity() > 1)
0823   {
0824     std::cout << "SvtxEvaluator::fillOutputNtuples() entered" << std::endl;
0825   }
0826 
0827   ActsGeometry* tgeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
0828   if (!tgeometry)
0829   {
0830     std::cout << "No Acts geometry on node tree. Can't  continue."
0831               << std::endl;
0832     return;
0833   }
0834 
0835   SvtxVertexEval* vertexeval = _svtxevalstack->get_vertex_eval();
0836   SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval();
0837   SvtxTrackEval* trackeval = _svtxevalstack->get_track_eval();
0838   SvtxHitEval* hiteval = _svtxevalstack->get_hit_eval();
0839   SvtxTruthEval* trutheval = _svtxevalstack->get_truth_eval();
0840 
0841   float nhit_tpc_all = 0;
0842   float nhit_tpc_in = 0;
0843   float nhit_tpc_mid = 0;
0844   float nhit_tpc_out = 0;
0845   float nclus_all = 0;
0846   float nclus_tpc = 0;
0847   float nclus_intt = 0;
0848   float nclus_maps = 0;
0849   float nclus_mms = 0;
0850   float nhit[100];
0851   for (float& i : nhit)
0852   {
0853     i = 0;
0854   }
0855   float occ11 = 0;
0856   float occ116 = 0;
0857   float occ21 = 0;
0858   float occ216 = 0;
0859   float occ31 = 0;
0860   float occ316 = 0;
0861 
0862   TrkrHitSetContainer* hitmap_in = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
0863   if (hitmap_in)
0864   {
0865     TrkrHitSetContainer::ConstRange all_hitsets = hitmap_in->getHitSets();
0866     for (TrkrHitSetContainer::ConstIterator hitsetiter = all_hitsets.first;
0867          hitsetiter != all_hitsets.second;
0868          ++hitsetiter)
0869     {
0870       // we have a single hitset, get the layer
0871       unsigned int layer = TrkrDefs::getLayer(hitsetiter->first);
0872       if (layer >= _nlayers_maps + _nlayers_intt && layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0873       {
0874         // count all hits in this hitset
0875         TrkrHitSet::ConstRange hitrangei = hitsetiter->second->getHits();
0876         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
0877              hitr != hitrangei.second;
0878              ++hitr)
0879         {
0880           nhit[layer]++;
0881           nhit_tpc_all++;
0882           if ((float) layer == _nlayers_maps + _nlayers_intt)
0883           {
0884             nhit_tpc_in++;
0885           }
0886           if ((float) layer == _nlayers_maps + _nlayers_intt + _nlayers_tpc - 1)
0887           {
0888             nhit_tpc_out++;
0889           }
0890           if ((float) layer == _nlayers_maps + _nlayers_intt + _nlayers_tpc / 2 - 1)  // NOLINT(bugprone-integer-division)
0891           {
0892             nhit_tpc_mid++;
0893           }
0894         }
0895       }
0896     }
0897   }
0898   /**********/
0899   PHG4TpcGeomContainer* geom_container =
0900       findNode::getClass<PHG4TpcGeomContainer>(topNode, "TPCGEOMCONTAINER");
0901   if (!geom_container)
0902   {
0903     std::cout << PHWHERE << "ERROR: Can't find node TPCGEOMCONTAINER" << std::endl;
0904     return;
0905   }
0906   PHG4TpcGeom* GeoLayer;
0907   int layer = _nlayers_maps + _nlayers_intt;
0908   GeoLayer = geom_container->GetLayerCellGeom(layer);
0909   int nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0910   float nhits = nhit[layer];
0911   occ11 = nhits / nbins;
0912   if (Verbosity() > 1)
0913   {
0914     std::cout << " occ11 = " << occ11
0915               << " nbins = " << nbins
0916               << " nhits = " << nhits
0917               << " layer = " << layer
0918               << std::endl;
0919   }
0920   layer = _nlayers_maps + _nlayers_intt + 15;
0921   GeoLayer = geom_container->GetLayerCellGeom(layer);
0922   nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0923   nhits = nhit[layer];
0924   occ116 = nhits / nbins;
0925 
0926   layer = _nlayers_maps + _nlayers_intt + 16;
0927   GeoLayer = geom_container->GetLayerCellGeom(layer);
0928   nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0929   nhits = nhit[layer];
0930   occ21 = nhits / nbins;
0931   layer = _nlayers_maps + _nlayers_intt + 31;
0932   GeoLayer = geom_container->GetLayerCellGeom(layer);
0933   nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0934   nhits = nhit[layer];
0935   occ216 = nhits / nbins;
0936   layer = _nlayers_maps + _nlayers_intt + 32;
0937   GeoLayer = geom_container->GetLayerCellGeom(layer);
0938   nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0939   nhits = nhit[layer];
0940   occ31 = nhits / nbins;
0941   layer = _nlayers_maps + _nlayers_intt + 47;
0942   GeoLayer = geom_container->GetLayerCellGeom(layer);
0943   nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0944   nhits = nhit[layer];
0945   occ316 = nhits / nbins;
0946 
0947   if (Verbosity() > 1)
0948   {
0949     std::cout << " occ11 = " << occ11
0950               << " occ116 = " << occ116
0951               << " occ21 = " << occ21
0952               << " occ216 = " << occ216
0953               << " occ31 = " << occ31
0954               << " occ316 = " << occ316
0955               << std::endl;
0956   }
0957   TrkrClusterContainer* clustermap_in = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
0958   if (!clustermap_in)
0959   {
0960     clustermap_in = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0961   }
0962 
0963   if (clustermap_in)
0964   {
0965     nclus_all = clustermap_in->size();
0966 
0967     for (const auto& hitsetkey : clustermap_in->getHitSetKeys())
0968     {
0969       auto range = clustermap_in->getClusters(hitsetkey);
0970       for (auto iter_cin = range.first; iter_cin != range.second; ++iter_cin)
0971       {
0972         TrkrDefs::cluskey cluster_key = iter_cin->first;
0973         unsigned int local_layer = TrkrDefs::getLayer(cluster_key);
0974         if (_nlayers_maps > 0)
0975         {
0976           if (local_layer < _nlayers_maps)
0977           {
0978             nclus_maps++;
0979           }
0980         }
0981         if (_nlayers_intt > 0)
0982         {
0983           if (local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
0984           {
0985             nclus_intt++;
0986           }
0987         }
0988         if (_nlayers_tpc > 0)
0989         {
0990           if (local_layer >= _nlayers_maps + _nlayers_intt && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0991           {
0992             nclus_tpc++;
0993           }
0994         }
0995         if (_nlayers_mms > 0)
0996         {
0997           if (local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0998           {
0999             nclus_mms++;
1000           }
1001         }
1002       }
1003     }
1004   }
1005   //-----------------------
1006   // fill the info NTuple
1007   //-----------------------
1008   if (_ntp_info)
1009   {
1010     if (Verbosity() > 1)
1011     {
1012       std::cout << "Filling ntp_info " << std::endl;
1013     }
1014     float ntrk = 0;
1015     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
1016     if (trackmap)
1017     {
1018       ntrk = (float) trackmap->size();
1019     }
1020     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
1021     int nprim = truthinfo->GetNumPrimaryVertexParticles();
1022     if (Verbosity() > 0)
1023     {
1024       std::cout << "EVENTINFO SEED: " << m_fSeed << std::endl;
1025       std::cout << "EVENTINFO NHIT: " << std::setprecision(9) << nhit_tpc_all << std::endl;
1026       std::cout << "EVENTINFO NTRKGEN: " << nprim << std::endl;
1027       std::cout << "EVENTINFO NTRKREC: " << ntrk << std::endl;
1028     }
1029     float info_data[] = {(float) _ievent, m_fSeed,
1030                          occ11, occ116, occ21, occ216, occ31, occ316,
1031                          (float) nprim,
1032                          0,
1033                          ntrk,
1034                          nhit_tpc_all,
1035                          nhit_tpc_in,
1036                          nhit_tpc_mid,
1037                          nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1038 
1039     _ntp_info->Fill(info_data);
1040   }
1041 
1042   //-----------------------
1043   // fill the Vertex NTuple
1044   //-----------------------
1045   bool doit = true;
1046   if (_ntp_vertex && doit)
1047   {
1048     if (Verbosity() > 1)
1049     {
1050       std::cout << "Filling ntp_vertex " << std::endl;
1051       std::cout << "start vertex time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1052       _timer->restart();
1053     }
1054 
1055     GlobalVertexMap* gvertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
1056     SvtxVertexMap* vertexmap = nullptr;
1057     if (_use_initial_vertex)
1058     {
1059       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
1060     }
1061     else if (_use_genfit_vertex)
1062     {
1063       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapRefit");
1064     }
1065     else
1066     {
1067       vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
1068     }
1069 
1070     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
1071 
1072     if (gvertexmap && vertexmap && truthinfo)
1073     {
1074       const auto prange = truthinfo->GetPrimaryParticleRange();
1075       std::map<int, unsigned int> embedvtxid_particle_count;
1076       std::map<int, unsigned int> embedvtxid_maps_particle_count;
1077       std::map<int, unsigned int> vertex_particle_count;
1078 
1079       if (_do_vtx_eval_light == false)
1080       {
1081         for (auto iter = prange.first; iter != prange.second; ++iter)  // process all primary paricle
1082         {
1083           const int point_id = iter->second->get_vtx_id();
1084           int gembed = truthinfo->isEmbededVtx(iter->second->get_vtx_id());
1085           ++vertex_particle_count[point_id];
1086           ++embedvtxid_particle_count[gembed];
1087           PHG4Particle* g4particle = iter->second;
1088 
1089           if (_scan_for_embedded && gembed <= 0)
1090           {
1091             continue;
1092           }
1093 
1094           std::set<TrkrDefs::cluskey> g4clusters = clustereval->all_clusters_from(g4particle);
1095           unsigned int nglmaps = 0;
1096 
1097           std::vector<int> lmaps(_nlayers_maps + 1, 0);
1098           for (const TrkrDefs::cluskey g4cluster : g4clusters)
1099           {
1100             unsigned int local_layer = TrkrDefs::getLayer(g4cluster);
1101             // std::cout<<__LINE__<<": " << _ievent <<": " <<gtrackID << ": " << local_layer <<": " <<g4cluster->get_id() <<std::endl;
1102             if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
1103             {
1104               lmaps[local_layer] = 1;
1105             }
1106           }
1107           if (_nlayers_maps > 0)
1108           {
1109             for (unsigned int i = 0; i < _nlayers_maps; i++)
1110             {
1111               nglmaps += lmaps[i];
1112             }
1113           }
1114           float gpx = g4particle->get_px();
1115           float gpy = g4particle->get_py();
1116           float gpz = g4particle->get_pz();
1117           float gpt = std::numeric_limits<float>::quiet_NaN();
1118           float geta = std::numeric_limits<float>::quiet_NaN();
1119 
1120           if (gpx != 0 && gpy != 0)
1121           {
1122             TVector3 gv(gpx, gpy, gpz);
1123             gpt = gv.Pt();
1124             geta = gv.Eta();
1125             //          gphi = gv.Phi();
1126           }
1127 
1128           if (nglmaps == 3 && std::abs(geta) < 1.0 && gpt > 0.5)
1129           {
1130             ++embedvtxid_maps_particle_count[gembed];
1131           }
1132         }
1133       }
1134 
1135       auto vrange = truthinfo->GetPrimaryVtxRange();
1136       std::map<int, bool> embedvtxid_found;
1137       std::map<int, int> embedvtxid_vertex_id;
1138       std::map<int, PHG4VtxPoint*> embedvtxid_vertex;
1139       for (auto iter = vrange.first; iter != vrange.second; ++iter)  // process all primary vertexes
1140       {
1141         const int point_id = iter->first;
1142         int gembed = truthinfo->isEmbededVtx(point_id);
1143 
1144         if (_scan_for_embedded && gembed <= 0)
1145         {
1146           continue;
1147         }
1148 
1149         auto search = embedvtxid_found.find(gembed);
1150         if (search != embedvtxid_found.end())
1151         {
1152           embedvtxid_vertex_id[gembed] = point_id;
1153           embedvtxid_vertex[gembed] = iter->second;
1154         }
1155         else
1156         {
1157           if (vertex_particle_count[embedvtxid_vertex_id[gembed]] < vertex_particle_count[point_id])
1158           {
1159             embedvtxid_vertex_id[gembed] = point_id;
1160             embedvtxid_vertex[gembed] = iter->second;
1161           }
1162         }
1163         embedvtxid_found[gembed] = false;
1164       }
1165 
1166       unsigned int ngembed = 0;
1167       for (auto& iter : embedvtxid_found)
1168       {
1169         if (iter.first >= 0)
1170         {
1171           continue;
1172         }
1173         ++ngembed;
1174       }
1175 
1176       for (auto& iter : *gvertexmap)
1177       {
1178         GlobalVertex* gvertex = iter.second;
1179         auto svtxviter = gvertex->find_vertexes(GlobalVertex::SVTX);
1180         if (svtxviter == gvertex->end_vertexes())
1181         {
1182           continue;
1183         }
1184 
1185         GlobalVertex::VertexVector vertices = svtxviter->second;
1186         for (auto& vertex : vertices)
1187         {
1188           PHG4VtxPoint* point = vertexeval->max_truth_point_by_ntracks(vertex);
1189           int vertexID = vertex->get_id();
1190           float vx = vertex->get_x();
1191           float vy = vertex->get_y();
1192           float vz = vertex->get_z();
1193           float ntracks = vertex->size_tracks();
1194           float chi2 = vertex->get_chisq();
1195           float ndof = vertex->get_ndof();
1196           float gvx = std::numeric_limits<float>::quiet_NaN();
1197           float gvy = std::numeric_limits<float>::quiet_NaN();
1198           float gvz = std::numeric_limits<float>::quiet_NaN();
1199           float gvt = std::numeric_limits<float>::quiet_NaN();
1200           float gembed = std::numeric_limits<float>::quiet_NaN();
1201           float gntracks = truthinfo->GetNumPrimaryVertexParticles();
1202           float gntracksmaps = std::numeric_limits<float>::quiet_NaN();
1203           float gnembed = std::numeric_limits<float>::quiet_NaN();
1204           float nfromtruth = std::numeric_limits<float>::quiet_NaN();
1205           if (point)
1206           {
1207             const int point_id = point->get_id();
1208             gvx = point->get_x();
1209             gvy = point->get_y();
1210             gvz = point->get_z();
1211             gvt = point->get_t();
1212             gembed = truthinfo->isEmbededVtx(point_id);
1213             gntracks = embedvtxid_particle_count[(int) gembed];
1214             if (embedvtxid_maps_particle_count[(int) gembed] > 0 && std::abs(gvt) < 2000. && std::abs(gvz) < 13.0)
1215             {
1216               gntracksmaps = embedvtxid_maps_particle_count[(int) gembed];
1217             }
1218             gnembed = (float) ngembed;
1219             nfromtruth = vertexeval->get_ntracks_contribution(vertex, point);
1220             embedvtxid_found[(int) gembed] = true;
1221           }
1222 
1223           float vertex_data[] = {(float) _ievent, m_fSeed,
1224                                  (float) vertexID,
1225                                  vx,
1226                                  vy,
1227                                  vz,
1228                                  ntracks,
1229                                  chi2,
1230                                  ndof,
1231                                  gvx,
1232                                  gvy,
1233                                  gvz,
1234                                  gvt,
1235                                  gembed,
1236                                  gntracks,
1237                                  gntracksmaps,
1238                                  gnembed,
1239                                  nfromtruth,
1240                                  nhit_tpc_all,
1241                                  nhit_tpc_in,
1242                                  nhit_tpc_mid,
1243                                  nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1244 
1245           _ntp_vertex->Fill(vertex_data);
1246         }
1247       }
1248 
1249       if (!_scan_for_embedded)
1250       {
1251         for (std::map<int, bool>::iterator iter = embedvtxid_found.begin();
1252              iter != embedvtxid_found.end();
1253              ++iter)
1254         {
1255           if (embedvtxid_found[iter->first])
1256           {
1257             continue;
1258           }
1259 
1260           float vx = std::numeric_limits<float>::quiet_NaN();
1261           float vy = std::numeric_limits<float>::quiet_NaN();
1262           float vz = std::numeric_limits<float>::quiet_NaN();
1263           float ntracks = std::numeric_limits<float>::quiet_NaN();
1264 
1265           float gvx = std::numeric_limits<float>::quiet_NaN();
1266           float gvy = std::numeric_limits<float>::quiet_NaN();
1267           float gvz = std::numeric_limits<float>::quiet_NaN();
1268           float gvt = std::numeric_limits<float>::quiet_NaN();
1269           float gembed = iter->first;
1270           float gntracks = std::numeric_limits<float>::quiet_NaN();
1271           float gntracksmaps = std::numeric_limits<float>::quiet_NaN();
1272           float gnembed = std::numeric_limits<float>::quiet_NaN();
1273           float nfromtruth = std::numeric_limits<float>::quiet_NaN();
1274 
1275           PHG4VtxPoint* point = embedvtxid_vertex[gembed];
1276 
1277           if (point)
1278           {
1279             const int point_id = point->get_id();
1280             gvx = point->get_x();
1281             gvy = point->get_y();
1282             gvz = point->get_z();
1283             gvt = point->get_t();
1284             gembed = truthinfo->isEmbededVtx(point_id);
1285             gntracks = embedvtxid_particle_count[(int) gembed];
1286             if (embedvtxid_maps_particle_count[(int) gembed] > 0 && std::abs(gvt) < 2000 && std::abs(gvz) < 13.0)
1287             {
1288               gntracksmaps = embedvtxid_maps_particle_count[(int) gembed];
1289             }
1290             gnembed = (float) ngembed;
1291             //        nfromtruth = vertexeval->get_ntracks_contribution(vertex,point);
1292           }
1293 
1294           if (Verbosity() > 1)
1295           {
1296             std::cout << " adding vertex data " << std::endl;
1297           }
1298 
1299           float vertex_data[] = {(float) _ievent, m_fSeed,
1300                                  vx,
1301                                  vy,
1302                                  vz,
1303                                  ntracks,
1304                                  gvx,
1305                                  gvy,
1306                                  gvz,
1307                                  gvt,
1308                                  gembed,
1309                                  gntracks,
1310                                  gntracksmaps,
1311                                  gnembed,
1312                                  nfromtruth,
1313                                  nhit_tpc_all,
1314                                  nhit_tpc_in,
1315                                  nhit_tpc_mid,
1316                                  nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1317 
1318           _ntp_vertex->Fill(vertex_data);
1319         }
1320       }
1321     }
1322     if (Verbosity() > 1)
1323     {
1324       _timer->stop();
1325       std::cout << "vertex time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1326     }
1327   }
1328 
1329   //-----------------------
1330   // fill the gpoint NTuple
1331   //-----------------------
1332 
1333   if (_ntp_gpoint)
1334   {
1335     if (Verbosity() > 1)
1336     {
1337       std::cout << "Filling ntp_gpoint " << std::endl;
1338       _timer->restart();
1339     }
1340     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
1341 
1342     if (truthinfo)
1343     {
1344       auto vrange = truthinfo->GetPrimaryVtxRange();
1345       const auto prange = truthinfo->GetPrimaryParticleRange();
1346 
1347       std::map<int, unsigned int> vertex_particle_count;
1348       for (auto iter = prange.first; iter != prange.second; ++iter)  // process all primary paricle
1349       {
1350         ++vertex_particle_count[iter->second->get_vtx_id()];
1351       }
1352 
1353       for (auto iter = vrange.first; iter != vrange.second; ++iter)  // process all primary vertexes
1354       {
1355         const int point_id = iter->first;
1356         PHG4VtxPoint* point = iter->second;
1357 
1358         //      PHG4VtxPoint* point =  truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex());
1359 
1360         if (point)
1361         {
1362           const Vertex* vertex = vertexeval->best_vertex_from(point);
1363 
1364           float gvx = point->get_x();
1365           float gvy = point->get_y();
1366           float gvz = point->get_z();
1367           float gvt = point->get_t();
1368           float gntracks = vertex_particle_count[point_id];
1369 
1370           float gembed = truthinfo->isEmbededVtx(point_id);
1371           float vx = std::numeric_limits<float>::quiet_NaN();
1372           float vy = std::numeric_limits<float>::quiet_NaN();
1373           float vz = std::numeric_limits<float>::quiet_NaN();
1374           float ntracks = std::numeric_limits<float>::quiet_NaN();
1375           float nfromtruth = std::numeric_limits<float>::quiet_NaN();
1376 
1377           if (vertex)
1378           {
1379             vx = vertex->get_x();
1380             vy = vertex->get_y();
1381             vz = vertex->get_z();
1382             ntracks = vertex->size_tracks();
1383             nfromtruth = vertexeval->get_ntracks_contribution(vertex, point);
1384           }
1385 
1386           float gpoint_data[] = {(float) _ievent, m_fSeed,
1387                                  gvx,
1388                                  gvy,
1389                                  gvz,
1390                                  gvt,
1391                                  gntracks,
1392                                  gembed,
1393                                  vx,
1394                                  vy,
1395                                  vz,
1396                                  ntracks,
1397                                  nfromtruth,
1398                                  nhit_tpc_all,
1399                                  nhit_tpc_in,
1400                                  nhit_tpc_mid,
1401                                  nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1402 
1403           _ntp_gpoint->Fill(gpoint_data);
1404         }
1405       }
1406     }
1407     if (Verbosity() > 1)
1408     {
1409       _timer->stop();
1410       std::cout << "gpoint time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1411     }
1412   }
1413 
1414   //---------------------
1415   // fill the G4hit NTuple
1416   //---------------------
1417 
1418   if (_ntp_g4hit)
1419   {
1420     if (Verbosity() > 1)
1421     {
1422       std::cout << "Filling ntp_g4hit " << std::endl;
1423       _timer->restart();
1424     }
1425     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits();
1426     for (auto* g4hit : g4hits)
1427     {
1428       PHG4Particle* g4particle = trutheval->get_particle(g4hit);
1429 
1430       float g4hitID = g4hit->get_hit_id();
1431       float gx = g4hit->get_avg_x();
1432       float gy = g4hit->get_avg_y();
1433       float gz = g4hit->get_avg_z();
1434       TVector3 vg4(gx, gy, gz);
1435       float gt = g4hit->get_avg_t();
1436       float gpl = g4hit->get_path_length();
1437       TVector3 vin(g4hit->get_x(0), g4hit->get_y(0), g4hit->get_z(0));
1438       TVector3 vout(g4hit->get_x(1), g4hit->get_y(1), g4hit->get_z(1));
1439       float gdphi = vin.DeltaPhi(vout);
1440       float gdz = std::abs(g4hit->get_z(1) - g4hit->get_z(0));
1441       float gedep = g4hit->get_edep();
1442       float glayer = g4hit->get_layer();
1443 
1444       float gtrackID = g4hit->get_trkid();
1445 
1446       float gflavor = std::numeric_limits<float>::quiet_NaN();
1447       float gpx = std::numeric_limits<float>::quiet_NaN();
1448       float gpy = std::numeric_limits<float>::quiet_NaN();
1449       float gpz = std::numeric_limits<float>::quiet_NaN();
1450       TVector3 vec(g4hit->get_avg_x(), g4hit->get_avg_y(), g4hit->get_avg_z());
1451       float geta = vec.Eta();
1452       float gphi = vec.Phi();
1453       float gvx = std::numeric_limits<float>::quiet_NaN();
1454       float gvy = std::numeric_limits<float>::quiet_NaN();
1455       float gvz = std::numeric_limits<float>::quiet_NaN();
1456 
1457       float gembed = std::numeric_limits<float>::quiet_NaN();
1458       float gprimary = std::numeric_limits<float>::quiet_NaN();
1459 
1460       float gfpx = 0.;
1461       float gfpy = 0.;
1462       float gfpz = 0.;
1463       float gfx = 0.;
1464       float gfy = 0.;
1465       float gfz = 0.;
1466 
1467       if (g4particle)
1468       {
1469         if (_scan_for_embedded)
1470         {
1471           if (trutheval->get_embed(g4particle) <= 0)
1472           {
1473             continue;
1474           }
1475         }
1476 
1477         gflavor = g4particle->get_pid();
1478         gpx = g4particle->get_px();
1479         gpy = g4particle->get_py();
1480         gpz = g4particle->get_pz();
1481 
1482         PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
1483 
1484         if (vtx)
1485         {
1486           gvx = vtx->get_x();
1487           gvy = vtx->get_y();
1488           gvz = vtx->get_z();
1489         }
1490         PHG4Hit* outerhit = nullptr;
1491         if (_do_eval_light == false)
1492         {
1493           outerhit = trutheval->get_outermost_truth_hit(g4particle);
1494         }
1495 
1496         if (outerhit)
1497         {
1498           gfpx = outerhit->get_px(1);
1499           gfpy = outerhit->get_py(1);
1500           gfpz = outerhit->get_pz(1);
1501           gfx = outerhit->get_x(1);
1502           gfy = outerhit->get_y(1);
1503           gfz = outerhit->get_z(1);
1504         }
1505 
1506         gembed = trutheval->get_embed(g4particle);
1507         gprimary = trutheval->is_primary(g4particle);
1508       }  //       if (g4particle)
1509 
1510       std::set<TrkrDefs::cluskey> clusters = clustereval->all_clusters_from(g4hit);
1511       float nclusters = clusters.size();
1512 
1513       // best cluster reco'd
1514       TrkrDefs::cluskey cluster_key = clustereval->best_cluster_from(g4hit);
1515 
1516       float clusID = std::numeric_limits<float>::quiet_NaN();
1517       float x = std::numeric_limits<float>::quiet_NaN();
1518       float y = std::numeric_limits<float>::quiet_NaN();
1519       float z = std::numeric_limits<float>::quiet_NaN();
1520       float eta = std::numeric_limits<float>::quiet_NaN();
1521       float phi = std::numeric_limits<float>::quiet_NaN();
1522       float e = std::numeric_limits<float>::quiet_NaN();
1523       float adc = std::numeric_limits<float>::quiet_NaN();
1524       float local_layer = std::numeric_limits<float>::quiet_NaN();
1525       float size = std::numeric_limits<float>::quiet_NaN();
1526       float efromtruth = std::numeric_limits<float>::quiet_NaN();
1527       float dphitru = std::numeric_limits<float>::quiet_NaN();
1528       float detatru = std::numeric_limits<float>::quiet_NaN();
1529       float dztru = std::numeric_limits<float>::quiet_NaN();
1530       float drtru = std::numeric_limits<float>::quiet_NaN();
1531 
1532       TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
1533       if (!clustermap)
1534       {
1535         clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
1536       }
1537 
1538       TrkrCluster* cluster = clustermap->findCluster(cluster_key);
1539 
1540       if (cluster)
1541       {
1542         clusID = cluster_key;
1543         // auto trkrid = TrkrDefs::getTrkrId(cluster_key);
1544         Acts::Vector3 global;
1545         global = tgeometry->getGlobalPosition(cluster_key, cluster);
1546         x = global(0);
1547         y = global(1);
1548         z = global(2);
1549         TVector3 vec2(x, y, z);
1550         eta = vec2.Eta();
1551         phi = vec2.Phi();
1552         e = cluster->getAdc();
1553         adc = cluster->getAdc();
1554         local_layer = (float) TrkrDefs::getLayer(cluster_key);
1555         size = 0.0;
1556         // count all hits for this cluster
1557 
1558         TrkrClusterHitAssoc* cluster_hit_map = findNode::getClass<TrkrClusterHitAssoc>(topNode, "TRKR_CLUSTERHITASSOC");
1559         std::pair<std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator, std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator>
1560             hitrange = cluster_hit_map->getHits(cluster_key);
1561         for (std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator
1562                  clushititer = hitrange.first;
1563              clushititer != hitrange.second; ++clushititer)
1564         {
1565           ++size;
1566         }
1567 
1568         dphitru = vec2.DeltaPhi(vg4);
1569         detatru = eta - geta;
1570         dztru = z - gz;
1571         drtru = vec2.DeltaR(vg4);
1572         if (g4particle)
1573         {
1574           efromtruth = clustereval->get_energy_contribution(cluster_key, g4particle);
1575         }
1576       }
1577 
1578       float g4hit_data[] = {(float) _ievent, m_fSeed,
1579                             g4hitID,
1580                             gx,
1581                             gy,
1582                             gz,
1583                             gt,
1584                             gpl,
1585                             gedep,
1586                             geta,
1587                             gphi,
1588                             gdphi,
1589                             gdz,
1590                             glayer,
1591                             gtrackID,
1592                             gflavor,
1593                             gpx,
1594                             gpy,
1595                             gpz,
1596                             gvx,
1597                             gvy,
1598                             gvz,
1599                             gfpx,
1600                             gfpy,
1601                             gfpz,
1602                             gfx,
1603                             gfy,
1604                             gfz,
1605                             gembed,
1606                             gprimary,
1607                             nclusters,
1608                             clusID,
1609                             x,
1610                             y,
1611                             z,
1612                             eta,
1613                             phi,
1614                             e,
1615                             adc,
1616                             local_layer,
1617                             size,
1618                             efromtruth,
1619                             dphitru,
1620                             detatru,
1621                             dztru,
1622                             drtru,
1623                             nhit_tpc_all,
1624                             nhit_tpc_in,
1625                             nhit_tpc_mid,
1626                             nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1627 
1628       _ntp_g4hit->Fill(g4hit_data);
1629     }
1630     if (Verbosity() > 1)
1631     {
1632       _timer->stop();
1633       std::cout << "g4hit time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1634     }
1635   }
1636 
1637   //--------------------
1638   // fill the Hit NTuple
1639   //--------------------
1640 
1641   if (_ntp_hit)
1642   {
1643     if (Verbosity() >= 1)
1644     {
1645       std::cout << "Filling ntp_hit " << std::endl;
1646       _timer->restart();
1647     }
1648     // need things off of the DST...
1649     TrkrHitSetContainer* hitmap = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
1650     PHG4TpcGeomContainer* local_geom_container =
1651         findNode::getClass<PHG4TpcGeomContainer>(topNode, "TPCGEOMCONTAINER");
1652     if (!local_geom_container)
1653     {
1654       std::cout << PHWHERE << "ERROR: Can't find node TPCGEOMCONTAINER" << std::endl;
1655       return;
1656     }
1657 
1658     if (hitmap)
1659     {
1660       TrkrHitSetContainer::ConstRange all_hitsets = hitmap->getHitSets();
1661       for (TrkrHitSetContainer::ConstIterator iter = all_hitsets.first;
1662            iter != all_hitsets.second;
1663            ++iter)
1664       {
1665         TrkrDefs::hitsetkey hitset_key = iter->first;
1666         TrkrHitSet* hitset = iter->second;
1667 
1668         // get all hits for this hitset
1669         TrkrHitSet::ConstRange hitrangei = hitset->getHits();
1670         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
1671              hitr != hitrangei.second;
1672              ++hitr)
1673         {
1674           TrkrDefs::hitkey hit_key = hitr->first;
1675           TrkrHit* hit = hitr->second;
1676           PHG4Hit* g4hit = hiteval->max_truth_hit_by_energy(hit_key);
1677           PHG4Particle* g4particle = trutheval->get_particle(g4hit);
1678           float event = _ievent;
1679           float hitID = hit_key;
1680           float e = hit->getEnergy();
1681           float adc = hit->getAdc();
1682           float local_layer = TrkrDefs::getLayer(hitset_key);
1683           float sector = TpcDefs::getSectorId(hitset_key);
1684           float side = TpcDefs::getSide(hitset_key);
1685           float cellID = 0;
1686           float ecell = hit->getAdc();
1687 
1688           float phibin = std::numeric_limits<float>::quiet_NaN();
1689           float zbin = std::numeric_limits<float>::quiet_NaN();
1690           float phi = std::numeric_limits<float>::quiet_NaN();
1691           float r = std::numeric_limits<float>::quiet_NaN();
1692           float x = std::numeric_limits<float>::quiet_NaN();
1693           float y = std::numeric_limits<float>::quiet_NaN();
1694           float z = std::numeric_limits<float>::quiet_NaN();
1695 
1696           if (local_layer >= _nlayers_maps + _nlayers_intt && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
1697           {
1698             PHG4TpcGeom* local_GeoLayer = local_geom_container->GetLayerCellGeom(local_layer);
1699             phibin = (float) TpcDefs::getPad(hit_key);
1700             zbin = (float) TpcDefs::getTBin(hit_key);
1701             phi = local_GeoLayer->get_phicenter(phibin, side);
1702             z = local_GeoLayer->get_zcenter(zbin);
1703             r = local_GeoLayer->get_radius();
1704             x = r * std::cos(phi);
1705             y = r * std::sin(phi);
1706           }
1707 
1708           float g4hitID = std::numeric_limits<float>::quiet_NaN();
1709           float gedep = std::numeric_limits<float>::quiet_NaN();
1710           float gx = std::numeric_limits<float>::quiet_NaN();
1711           float gy = std::numeric_limits<float>::quiet_NaN();
1712           float gz = std::numeric_limits<float>::quiet_NaN();
1713           float gt = std::numeric_limits<float>::quiet_NaN();
1714           float gtrackID = std::numeric_limits<float>::quiet_NaN();
1715           float gflavor = std::numeric_limits<float>::quiet_NaN();
1716           float gpx = std::numeric_limits<float>::quiet_NaN();
1717           float gpy = std::numeric_limits<float>::quiet_NaN();
1718           float gpz = std::numeric_limits<float>::quiet_NaN();
1719           float gvx = std::numeric_limits<float>::quiet_NaN();
1720           float gvy = std::numeric_limits<float>::quiet_NaN();
1721           float gvz = std::numeric_limits<float>::quiet_NaN();
1722           float gvt = std::numeric_limits<float>::quiet_NaN();
1723           float gfpx = std::numeric_limits<float>::quiet_NaN();
1724           float gfpy = std::numeric_limits<float>::quiet_NaN();
1725           float gfpz = std::numeric_limits<float>::quiet_NaN();
1726           float gfx = std::numeric_limits<float>::quiet_NaN();
1727           float gfy = std::numeric_limits<float>::quiet_NaN();
1728           float gfz = std::numeric_limits<float>::quiet_NaN();
1729           float gembed = std::numeric_limits<float>::quiet_NaN();
1730           float gprimary = std::numeric_limits<float>::quiet_NaN();
1731 
1732           float efromtruth = std::numeric_limits<float>::quiet_NaN();
1733 
1734           if (g4hit)
1735           {
1736             g4hitID = g4hit->get_hit_id();
1737             gedep = g4hit->get_edep();
1738             gx = g4hit->get_avg_x();
1739             gy = g4hit->get_avg_y();
1740             gz = g4hit->get_avg_z();
1741             gt = g4hit->get_avg_t();
1742 
1743             if (g4particle)
1744             {
1745               if (_scan_for_embedded)
1746               {
1747                 if (trutheval->get_embed(g4particle) <= 0)
1748                 {
1749                   continue;
1750                 }
1751               }
1752 
1753               gtrackID = g4particle->get_track_id();
1754               gflavor = g4particle->get_pid();
1755               gpx = g4particle->get_px();
1756               gpy = g4particle->get_py();
1757               gpz = g4particle->get_pz();
1758 
1759               PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
1760 
1761               if (vtx)
1762               {
1763                 gvx = vtx->get_x();
1764                 gvy = vtx->get_y();
1765                 gvz = vtx->get_z();
1766                 gvt = vtx->get_t();
1767               }
1768 
1769               PHG4Hit* outerhit = nullptr;
1770               if (_do_eval_light == false)
1771               {
1772                 outerhit = trutheval->get_outermost_truth_hit(g4particle);
1773               }
1774               if (outerhit)
1775               {
1776                 gfpx = outerhit->get_px(1);
1777                 gfpy = outerhit->get_py(1);
1778                 gfpz = outerhit->get_pz(1);
1779                 gfx = outerhit->get_x(1);
1780                 gfy = outerhit->get_y(1);
1781                 gfz = outerhit->get_z(1);
1782               }
1783               gembed = trutheval->get_embed(g4particle);
1784               gprimary = trutheval->is_primary(g4particle);
1785             }  //   if (g4particle){
1786           }
1787 
1788           if (g4particle)
1789           {
1790             efromtruth = hiteval->get_energy_contribution(hit_key, g4particle);
1791           }
1792 
1793           float hit_data[] = {
1794               event,
1795               (float) _iseed,
1796               hitID,
1797               e,
1798               adc,
1799               local_layer,
1800               sector,
1801               side,
1802               cellID,
1803               ecell,
1804               phibin,
1805               zbin,
1806               phi,
1807               x,
1808               y,
1809               z,
1810               g4hitID,
1811               gedep,
1812               gx,
1813               gy,
1814               gz,
1815               gt,
1816               gtrackID,
1817               gflavor,
1818               gpx,
1819               gpy,
1820               gpz,
1821               gvx,
1822               gvy,
1823               gvz,
1824               gvt,
1825               gfpx,
1826               gfpy,
1827               gfpz,
1828               gfx,
1829               gfy,
1830               gfz,
1831               gembed,
1832               gprimary,
1833               efromtruth,
1834               nhit_tpc_all,
1835               nhit_tpc_in,
1836               nhit_tpc_mid,
1837               nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
1838 
1839           _ntp_hit->Fill(hit_data);
1840         }
1841       }
1842     }
1843     if (Verbosity() >= 1)
1844     {
1845       _timer->stop();
1846       std::cout << "hit time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1847     }
1848   }
1849 
1850   //------------------------
1851   // fill the Cluster NTuple
1852   //------------------------
1853 
1854   if (Verbosity() >= 1)
1855   {
1856     std::cout << "check for ntp_cluster" << std::endl;
1857     _timer->restart();
1858   }
1859 
1860   if (_ntp_cluster && !_scan_for_embedded)
1861   {
1862     if (Verbosity() > 1)
1863     {
1864       std::cout << "Filling ntp_cluster (all of them) " << std::endl;
1865     }
1866     // need things off of the DST...
1867     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
1868     if (!clustermap)
1869     {
1870       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
1871     }
1872 
1873     TrkrClusterHitAssoc* clusterhitmap = findNode::getClass<TrkrClusterHitAssoc>(topNode, "TRKR_CLUSTERHITASSOC");
1874     TrkrHitSetContainer* hitsets = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
1875     TrkrClusterIterationMapv1* _iteration_map = findNode::getClass<TrkrClusterIterationMapv1>(topNode, "CLUSTER_ITERATION_MAP");
1876     ClusterErrorPara ClusErrPara;
1877 
1878     if (Verbosity() > 1)
1879     {
1880       if (clustermap != nullptr)
1881       {
1882         std::cout << "got clustermap" << std::endl;
1883       }
1884       else
1885       {
1886         std::cout << "no clustermap" << std::endl;
1887       }
1888       if (clusterhitmap != nullptr)
1889       {
1890         std::cout << "got clusterhitmap" << std::endl;
1891       }
1892       else
1893       {
1894         std::cout << "no clusterhitmap" << std::endl;
1895       }
1896       if (hitsets != nullptr)
1897       {
1898         std::cout << "got hitsets" << std::endl;
1899       }
1900       else
1901       {
1902         std::cout << "no hitsets" << std::endl;
1903       }
1904     }
1905 
1906     if (clustermap && clusterhitmap && hitsets)
1907     {
1908       for (const auto& hitsetkey : clustermap->getHitSetKeys())
1909       {
1910         int hitsetlayer = TrkrDefs::getLayer(hitsetkey);
1911         auto range = clustermap->getClusters(hitsetkey);
1912         for (auto iter = range.first; iter != range.second; ++iter)
1913         {
1914           TrkrDefs::cluskey cluster_key = iter->first;
1915           TrkrCluster* cluster = clustermap->findCluster(cluster_key);
1916           SvtxTrack* track = trackeval->best_track_from(cluster_key);
1917           PHG4Particle* g4particle = clustereval->max_truth_particle_by_cluster_energy(cluster_key);
1918           float niter = 0;
1919           if (_iteration_map != nullptr)
1920           {
1921             niter = _iteration_map->getIteration(cluster_key);
1922           }
1923           float hitID = (float) cluster_key;
1924           // auto trkrid = TrkrDefs::getTrkrId(cluster_key);
1925           Acts::Vector3 cglob;
1926           cglob = tgeometry->getGlobalPosition(cluster_key, cluster);
1927           float x = cglob(0);
1928           float y = cglob(1);
1929           float z = cglob(2);
1930           TVector3 pos(x, y, z);
1931           float r = pos.Perp();
1932           float phi = pos.Phi();
1933           float eta = pos.Eta();
1934           float theta = pos.Theta();
1935 
1936           float ex = 0;
1937           float ey = 0;
1938           float ez = 0;
1939           float ephi = 0;
1940           float pez = 0;
1941           float pephi = 0;
1942           float size = 0;
1943           float phisize = 0;
1944           float zsize = 0;
1945           float maxadc = -999;
1946           float redge = std::numeric_limits<float>::quiet_NaN();
1947           float pedge = std::numeric_limits<float>::quiet_NaN();
1948           float ovlp = std::numeric_limits<float>::quiet_NaN();
1949 
1950           auto para_errors = ClusterErrorPara::get_clusterv5_modified_error(cluster, r, cluster_key);
1951           phisize = cluster->getPhiSize();
1952           zsize = cluster->getZSize();
1953           // double clusRadius = r;
1954           ez = sqrt(para_errors.second);
1955           ephi = sqrt(para_errors.first);
1956           maxadc = cluster->getMaxAdc();
1957           pedge = cluster->getEdge();
1958           ovlp = cluster->getOverlap();
1959 
1960           if (hitsetlayer == 7 || hitsetlayer == 22 || hitsetlayer == 23 || hitsetlayer == 38 || hitsetlayer == 39)
1961           {
1962             redge = 1;
1963           }
1964 
1965           float e = cluster->getAdc();
1966           float adc = cluster->getAdc();
1967           float local_layer = (float) TrkrDefs::getLayer(cluster_key);
1968           float sector = TpcDefs::getSectorId(cluster_key);
1969           float side = TpcDefs::getSide(cluster_key);
1970 
1971           // count all hits for this cluster
1972           TrkrDefs::hitsetkey local_hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(cluster_key);
1973           int hitsetlayer2 = TrkrDefs::getLayer(local_hitsetkey);
1974           if (hitsetlayer != local_layer)
1975           {
1976             std::cout << "WARNING hitset layer " << hitsetlayer << "| " << hitsetlayer2 << " layer " << local_layer << std::endl;
1977           }
1978           /*else{
1979             std::cout << "Good    hitset layer " << hitsetlayer << "| " << hitsetlayer2 << " layer " << local_layer << std::endl;
1980           }
1981           */
1982           float sumadc = 0;
1983           TrkrHitSetContainer::Iterator hitset = hitsets->findOrAddHitSet(local_hitsetkey);
1984           std::pair<std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator, std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator>
1985               hitrange = clusterhitmap->getHits(cluster_key);
1986           for (std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator
1987                    clushititer = hitrange.first;
1988                clushititer != hitrange.second; ++clushititer)
1989           {
1990             TrkrHit* hit = hitset->second->getHit(clushititer->second);
1991             if (!hit)
1992             {
1993               continue;
1994             }
1995 
1996             ++size;
1997             sumadc += (hit->getAdc() - 70);
1998             maxadc = std::max<float>(hit->getAdc() - 70, maxadc);
1999           }
2000           e = sumadc;
2001 
2002           float trackID = std::numeric_limits<float>::quiet_NaN();
2003           if (track != nullptr)
2004           {
2005             trackID = track->get_id();
2006           }
2007 
2008           float g4hitID = std::numeric_limits<float>::quiet_NaN();
2009           float gx = std::numeric_limits<float>::quiet_NaN();
2010           float gy = std::numeric_limits<float>::quiet_NaN();
2011           float gz = std::numeric_limits<float>::quiet_NaN();
2012           float gr = std::numeric_limits<float>::quiet_NaN();
2013           float gphi = std::numeric_limits<float>::quiet_NaN();
2014           // float gedep = std::numeric_limits<float>::quiet_NaN();
2015           float geta = std::numeric_limits<float>::quiet_NaN();
2016           float gt = std::numeric_limits<float>::quiet_NaN();
2017           float gtrackID = std::numeric_limits<float>::quiet_NaN();
2018           float gflavor = std::numeric_limits<float>::quiet_NaN();
2019           float gpx = std::numeric_limits<float>::quiet_NaN();
2020           float gpy = std::numeric_limits<float>::quiet_NaN();
2021           float gpz = std::numeric_limits<float>::quiet_NaN();
2022           float gvx = std::numeric_limits<float>::quiet_NaN();
2023           float gvy = std::numeric_limits<float>::quiet_NaN();
2024           float gvz = std::numeric_limits<float>::quiet_NaN();
2025           float gvt = std::numeric_limits<float>::quiet_NaN();
2026           float gfpx = std::numeric_limits<float>::quiet_NaN();
2027           float gfpy = std::numeric_limits<float>::quiet_NaN();
2028           float gfpz = std::numeric_limits<float>::quiet_NaN();
2029           float gfx = std::numeric_limits<float>::quiet_NaN();
2030           float gfy = std::numeric_limits<float>::quiet_NaN();
2031           float gfz = std::numeric_limits<float>::quiet_NaN();
2032           float gembed = std::numeric_limits<float>::quiet_NaN();
2033           float gprimary = std::numeric_limits<float>::quiet_NaN();
2034 
2035           float efromtruth = std::numeric_limits<float>::quiet_NaN();
2036 
2037           if (Verbosity() > 1)
2038           {
2039             std::cout << PHWHERE << "  ****   reco: layer " << local_layer << std::endl;
2040             std::cout << "              reco cluster key " << cluster_key << "  r " << r << "  x " << x << "  y " << y << "  z " << z << "  phi " << phi << " adc " << adc << std::endl;
2041           }
2042           float nparticles = std::numeric_limits<float>::quiet_NaN();
2043 
2044           // get best matching truth cluster from clustereval
2045           const auto [truth_ckey, truth_cluster] = clustereval->max_truth_cluster_by_energy(cluster_key);
2046           if (truth_cluster)
2047           {
2048             if (Verbosity() > 1)
2049             {
2050               std::cout << "Found matching truth cluster with key " << truth_ckey << " for reco cluster key " << cluster_key << " in layer " << local_layer << std::endl;
2051             }
2052 
2053             g4hitID = 0;
2054             gx = truth_cluster->getX();
2055             gy = truth_cluster->getY();
2056             gz = truth_cluster->getZ();
2057             efromtruth = truth_cluster->getError(0, 0);
2058 
2059             TVector3 gpos(gx, gy, gz);
2060             gr = gpos.Perp();  // could also be just the center of the layer
2061             gphi = gpos.Phi();
2062             geta = gpos.Eta();
2063 
2064             if (g4particle)
2065             {
2066               gtrackID = g4particle->get_track_id();
2067               gflavor = g4particle->get_pid();
2068               gpx = g4particle->get_px();
2069               gpy = g4particle->get_py();
2070               gpz = g4particle->get_pz();
2071 
2072               PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
2073               if (vtx)
2074               {
2075                 gvx = vtx->get_x();
2076                 gvy = vtx->get_y();
2077                 gvz = vtx->get_z();
2078                 gvt = vtx->get_t();
2079               }
2080 
2081               PHG4Hit* outerhit = nullptr;
2082               if (_do_eval_light == false)
2083               {
2084                 outerhit = trutheval->get_outermost_truth_hit(g4particle);
2085               }
2086               if (outerhit)
2087               {
2088                 gfpx = outerhit->get_px(1);
2089                 gfpy = outerhit->get_py(1);
2090                 gfpz = outerhit->get_pz(1);
2091                 gfx = outerhit->get_x(1);
2092                 gfy = outerhit->get_y(1);
2093                 gfz = outerhit->get_z(1);
2094               }
2095 
2096               gembed = trutheval->get_embed(g4particle);
2097               gprimary = trutheval->is_primary(g4particle);
2098             }  //   if (g4particle){
2099 
2100             if (Verbosity() > 1)
2101             {
2102               std::cout << "             truth cluster key " << truth_ckey << " gr " << gr << " gx " << gx << " gy " << gy << " gz " << gz << " gphi " << gphi << " efromtruth " << efromtruth << std::endl;
2103             }
2104           }  //  if (truth_cluster) {
2105 
2106           if (g4particle)
2107           {
2108           }
2109           nparticles = clustereval->all_truth_particles(cluster_key).size();
2110 
2111           float cluster_data[] = {(float) _ievent,
2112                                   (float) _iseed,
2113                                   hitID,
2114                                   x,
2115                                   y,
2116                                   z,
2117                                   r,
2118                                   phi,
2119                                   eta,
2120                                   theta,
2121                                   ex,
2122                                   ey,
2123                                   ez,
2124                                   ephi,
2125                                   pez,
2126                                   pephi,
2127                                   e,
2128                                   adc,
2129                                   maxadc,
2130                                   local_layer,
2131                                   sector,
2132                                   side,
2133                                   size,
2134                                   phisize,
2135                                   zsize,
2136                                   pedge,
2137                                   redge,
2138                                   ovlp,
2139                                   trackID,
2140                                   niter,
2141                                   g4hitID,
2142                                   gx,
2143                                   gy,
2144                                   gz,
2145                                   gr,
2146                                   gphi,
2147                                   geta,
2148                                   gt,
2149                                   gtrackID,
2150                                   gflavor,
2151                                   gpx,
2152                                   gpy,
2153                                   gpz,
2154                                   gvx,
2155                                   gvy,
2156                                   gvz,
2157                                   gvt,
2158                                   gfpx,
2159                                   gfpy,
2160                                   gfpz,
2161                                   gfx,
2162                                   gfy,
2163                                   gfz,
2164                                   gembed,
2165                                   gprimary,
2166                                   efromtruth,
2167                                   nparticles,
2168                                   nhit_tpc_all,
2169                                   nhit_tpc_in,
2170                                   nhit_tpc_mid,
2171                                   nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
2172 
2173           _ntp_cluster->Fill(cluster_data);
2174         }
2175       }
2176     }
2177   }
2178   else if (_ntp_cluster && _scan_for_embedded)
2179   {
2180     if (Verbosity() > 1)
2181     {
2182       std::cout << "Filling ntp_cluster (embedded only) " << std::endl;
2183     }
2184 
2185     // if only scanning embedded signals, loop over all the tracks from
2186     // embedded particles and report all of their clusters, including those
2187     // from other sources (noise hits on the embedded track)
2188 
2189     // need things off of the DST...
2190     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
2191 
2192     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
2193     if (!clustermap)
2194     {
2195       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
2196     }
2197     ClusterErrorPara ClusErrPara;
2198 
2199     TrkrClusterHitAssoc* clusterhitmap = findNode::getClass<TrkrClusterHitAssoc>(topNode, "TRKR_CLUSTERHITASSOC");
2200     TrkrHitSetContainer* hitsets = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
2201     TrkrClusterIterationMapv1* _iteration_map = findNode::getClass<TrkrClusterIterationMapv1>(topNode, "CLUSTER_ITERATION_MAP");
2202 
2203     if (trackmap != nullptr && clustermap != nullptr && clusterhitmap != nullptr && hitsets != nullptr)
2204     {
2205       for (auto& iter : *trackmap)
2206       {
2207         SvtxTrack* track = iter.second;
2208 
2209         PHG4Particle* truth = trackeval->max_truth_particle_by_nclusters(track);
2210         if (truth)
2211         {
2212           if (trutheval->get_embed(truth) <= 0)
2213           {
2214             continue;
2215           }
2216         }
2217 
2218         std::vector<TrkrDefs::cluskey> clusters;
2219         auto* siseed = track->get_silicon_seed();
2220         if (siseed)
2221         {
2222           for (auto local_iter = siseed->begin_cluster_keys();
2223                local_iter != siseed->end_cluster_keys();
2224                ++local_iter)
2225           {
2226             TrkrDefs::cluskey cluster_key = *local_iter;
2227             clusters.push_back(cluster_key);
2228           }
2229         }
2230         auto* tpcseed = track->get_tpc_seed();
2231         if (tpcseed)
2232         {
2233           for (auto local_iter = tpcseed->begin_cluster_keys();
2234                local_iter != tpcseed->end_cluster_keys();
2235                ++local_iter)
2236           {
2237             TrkrDefs::cluskey cluster_key = *local_iter;
2238             clusters.push_back(cluster_key);
2239           }
2240         }
2241 
2242         // loop over all cluster keys and build ntuple
2243         for (unsigned long cluster_key : clusters)
2244         {
2245           TrkrCluster* cluster = clustermap->findCluster(cluster_key);
2246           if (!cluster)
2247           {
2248             continue;  // possible to be missing from corrected clusters if cluster mover fails
2249           }
2250 
2251           PHG4Hit* g4hit = clustereval->max_truth_hit_by_energy(cluster_key);
2252           PHG4Particle* g4particle = trutheval->get_particle(g4hit);
2253 
2254           float niter = 0;
2255           if (_iteration_map != nullptr)
2256           {
2257             niter = _iteration_map->getIteration(cluster_key);
2258           }
2259           float hitID = (float) TrkrDefs::getClusIndex(cluster_key);
2260           Acts::Vector3 glob = tgeometry->getGlobalPosition(cluster_key, cluster);
2261           float x = glob(0);
2262           float y = glob(1);
2263           float z = glob(2);
2264           TVector3 pos(x, y, z);
2265           float r = pos.Perp();
2266           float phi = pos.Phi();
2267           float eta = pos.Eta();
2268           float theta = pos.Theta();
2269           float ex = 0;
2270           float ey = 0;
2271           float ez = 0;
2272           float ephi = 0;
2273           float pez = 0;
2274           float pephi = 0;
2275           float size = 0;
2276           float phisize = 0;
2277           float zsize = 0;
2278           float maxadc = -999;
2279           float redge = std::numeric_limits<float>::quiet_NaN();
2280           float pedge = std::numeric_limits<float>::quiet_NaN();
2281           float ovlp = std::numeric_limits<float>::quiet_NaN();
2282 
2283           auto para_errors = ClusterErrorPara::get_clusterv5_modified_error(cluster, r, cluster_key);
2284           phisize = cluster->getPhiSize();
2285           zsize = cluster->getZSize();
2286           // double clusRadius = r;
2287           ez = sqrt(para_errors.second);
2288           ephi = sqrt(para_errors.first);
2289           maxadc = cluster->getMaxAdc();
2290           pedge = cluster->getEdge();
2291           ovlp = cluster->getOverlap();
2292 
2293           float e = cluster->getAdc();
2294           float adc = cluster->getAdc();
2295           float local_layer = (float) TrkrDefs::getLayer(cluster_key);
2296           float sector = TpcDefs::getSectorId(cluster_key);
2297           float side = TpcDefs::getSide(cluster_key);
2298           // count all hits for this cluster
2299           if (local_layer == 7 || local_layer == 22 || local_layer == 23 || local_layer == 38 || local_layer == 39)
2300           {
2301             redge = 1;
2302           }
2303 
2304           // count all hits for this cluster
2305           TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(cluster_key);
2306           TrkrHitSetContainer::Iterator hitset = hitsets->findOrAddHitSet(hitsetkey);
2307           std::pair<std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator, std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator>
2308               hitrange = clusterhitmap->getHits(cluster_key);
2309           for (std::multimap<TrkrDefs::cluskey, TrkrDefs::hitkey>::const_iterator
2310                    clushititer = hitrange.first;
2311                clushititer != hitrange.second; ++clushititer)
2312           {
2313             TrkrHit* hit = hitset->second->getHit(clushititer->second);
2314             ++size;
2315             maxadc = std::max<float>(hit->getAdc(), maxadc);
2316           }
2317 
2318           float trackID = std::numeric_limits<float>::quiet_NaN();
2319           trackID = track->get_id();
2320 
2321           float g4hitID = std::numeric_limits<float>::quiet_NaN();
2322           float gx = std::numeric_limits<float>::quiet_NaN();
2323           float gy = std::numeric_limits<float>::quiet_NaN();
2324           float gz = std::numeric_limits<float>::quiet_NaN();
2325           float gr = std::numeric_limits<float>::quiet_NaN();
2326           float gphi = std::numeric_limits<float>::quiet_NaN();
2327           // float gedep = std::numeric_limits<float>::quiet_NaN();
2328           float geta = std::numeric_limits<float>::quiet_NaN();
2329           float gt = std::numeric_limits<float>::quiet_NaN();
2330           float gtrackID = std::numeric_limits<float>::quiet_NaN();
2331           float gflavor = std::numeric_limits<float>::quiet_NaN();
2332           float gpx = std::numeric_limits<float>::quiet_NaN();
2333           float gpy = std::numeric_limits<float>::quiet_NaN();
2334           float gpz = std::numeric_limits<float>::quiet_NaN();
2335           float gvx = std::numeric_limits<float>::quiet_NaN();
2336           float gvy = std::numeric_limits<float>::quiet_NaN();
2337           float gvz = std::numeric_limits<float>::quiet_NaN();
2338           float gvt = std::numeric_limits<float>::quiet_NaN();
2339           float gfpx = std::numeric_limits<float>::quiet_NaN();
2340           float gfpy = std::numeric_limits<float>::quiet_NaN();
2341           float gfpz = std::numeric_limits<float>::quiet_NaN();
2342           float gfx = std::numeric_limits<float>::quiet_NaN();
2343           float gfy = std::numeric_limits<float>::quiet_NaN();
2344           float gfz = std::numeric_limits<float>::quiet_NaN();
2345           float gembed = std::numeric_limits<float>::quiet_NaN();
2346           float gprimary = std::numeric_limits<float>::quiet_NaN();
2347 
2348           float efromtruth = std::numeric_limits<float>::quiet_NaN();
2349 
2350           // get best matching truth cluster from clustereval
2351           const auto [truth_ckey, truth_cluster] = clustereval->max_truth_cluster_by_energy(cluster_key);
2352           if (truth_cluster)
2353           {
2354             if (Verbosity() > 1)
2355             {
2356               std::cout << "         Found matching truth cluster with key " << truth_ckey << " for reco cluster key " << cluster_key << " in layer " << local_layer << std::endl;
2357             }
2358 
2359             g4hitID = 0;
2360             gx = truth_cluster->getX();
2361             gy = truth_cluster->getY();
2362             gz = truth_cluster->getZ();
2363             efromtruth = truth_cluster->getError(0, 0);
2364 
2365             TVector3 gpos(gx, gy, gz);
2366             gr = gpos.Perp();
2367             gphi = gpos.Phi();
2368             geta = gpos.Eta();
2369 
2370             if (g4particle)
2371             {
2372               gtrackID = g4particle->get_track_id();
2373               gflavor = g4particle->get_pid();
2374               gpx = g4particle->get_px();
2375               gpy = g4particle->get_py();
2376               gpz = g4particle->get_pz();
2377 
2378               PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
2379               if (vtx)
2380               {
2381                 gvx = vtx->get_x();
2382                 gvy = vtx->get_y();
2383                 gvz = vtx->get_z();
2384                 gvt = vtx->get_t();
2385               }
2386               PHG4Hit* outerhit = nullptr;
2387               if (_do_eval_light == false)
2388               {
2389                 outerhit = trutheval->get_outermost_truth_hit(g4particle);
2390               }
2391               if (outerhit)
2392               {
2393                 gfpx = outerhit->get_px(1);
2394                 gfpy = outerhit->get_py(1);
2395                 gfpz = outerhit->get_pz(1);
2396                 gfx = outerhit->get_x(1);
2397                 gfy = outerhit->get_y(1);
2398                 gfz = outerhit->get_z(1);
2399               }
2400 
2401               gembed = trutheval->get_embed(g4particle);
2402               gprimary = trutheval->is_primary(g4particle);
2403             }  //   if (g4particle){
2404           }  //  if (g4hit) {
2405 
2406           float nparticles = clustereval->all_truth_particles(cluster_key).size();
2407 
2408           float cluster_data[] = {(float) _ievent,
2409                                   (float) _iseed,
2410                                   hitID,
2411                                   x,
2412                                   y,
2413                                   z,
2414                                   r,
2415                                   phi,
2416                                   eta,
2417                                   theta,
2418                                   ex,
2419                                   ey,
2420                                   ez,
2421                                   ephi,
2422                                   pez,
2423                                   pephi,
2424                                   e,
2425                                   adc,
2426                                   maxadc,
2427                                   local_layer,
2428                                   sector,
2429                                   side,
2430                                   size,
2431                                   phisize,
2432                                   zsize,
2433                                   pedge,
2434                                   redge,
2435                                   ovlp,
2436                                   trackID,
2437                                   niter,
2438                                   g4hitID,
2439                                   gx,
2440                                   gy,
2441                                   gz,
2442                                   gr,
2443                                   gphi,
2444                                   geta,
2445                                   gt,
2446                                   gtrackID,
2447                                   gflavor,
2448                                   gpx,
2449                                   gpy,
2450                                   gpz,
2451                                   gvx,
2452                                   gvy,
2453                                   gvz,
2454                                   gvt,
2455                                   gfpx,
2456                                   gfpy,
2457                                   gfpz,
2458                                   gfx,
2459                                   gfy,
2460                                   gfz,
2461                                   gembed,
2462                                   gprimary,
2463                                   efromtruth,
2464                                   nparticles,
2465                                   nhit_tpc_all,
2466                                   nhit_tpc_in,
2467                                   nhit_tpc_mid,
2468                                   nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
2469 
2470           _ntp_cluster->Fill(cluster_data);
2471         }
2472       }
2473     }
2474   }
2475   if (Verbosity() >= 1)
2476   {
2477     _timer->stop();
2478     std::cout << "cluster time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
2479   }
2480 
2481   // fill the truth cluster NTuple
2482   //-----------------------------------
2483 
2484   if (Verbosity() > 1)
2485   {
2486     std::cout << "check for ntp_g4cluster" << std::endl;
2487     _timer->restart();
2488   }
2489 
2490   if (_ntp_g4cluster)
2491   {
2492     if (Verbosity() >= 1)
2493     {
2494       std::cout << "Filling ntp_g4cluster " << std::endl;
2495     }
2496     ClusterErrorPara ClusErrPara;
2497     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
2498     PHG4TruthInfoContainer::ConstRange range = truthinfo->GetParticleRange();
2499     for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
2500          iter != range.second;
2501          ++iter)
2502     {
2503       PHG4Particle* g4particle = iter->second;
2504 
2505       if (_scan_for_embedded)
2506       {
2507         if (trutheval->get_embed(g4particle) <= 0)
2508         {
2509           continue;
2510         }
2511       }
2512 
2513       float gtrackID = g4particle->get_track_id();
2514       float gflavor = g4particle->get_pid();
2515       float gembed = trutheval->get_embed(g4particle);
2516       float gprimary = trutheval->is_primary(g4particle);
2517 
2518       if (Verbosity() > 1)
2519       {
2520         std::cout << PHWHERE << " PHG4Particle ID " << gtrackID << " gflavor " << gflavor << " gprimary " << gprimary << std::endl;
2521       }
2522 
2523       // Get the truth clusters from this particle
2524       std::map<TrkrDefs::cluskey, std::shared_ptr<TrkrCluster> > truth_clusters = trutheval->all_truth_clusters(g4particle);
2525 
2526       // loop over layers and add to ntuple
2527       for (const auto& [ckey, gclus] : truth_clusters)
2528       {
2529         unsigned int local_layer = TrkrDefs::getLayer(ckey);
2530 
2531         float gx = gclus->getX();
2532         float gy = gclus->getY();
2533         float gz = gclus->getZ();
2534         float gt = std::numeric_limits<float>::quiet_NaN();
2535         float gedep = gclus->getError(0, 0);
2536         float gadc = (float) gclus->getAdc();
2537 
2538         TVector3 gpos(gx, gy, gz);
2539         float gr = std::sqrt(gx * gx + gy * gy);
2540         float gphi = gpos.Phi();
2541         float geta = gpos.Eta();
2542 
2543         if (Verbosity() > 1)
2544         {
2545           std::cout << PHWHERE << "  ****   truth: layer " << local_layer << std::endl;
2546           std::cout << "             truth cluster key " << ckey << " gr " << gr << " gx " << gx << " gy " << gy << " gz " << gz
2547                     << " gphi " << gphi << " gedep " << gedep << " gadc " << gadc << std::endl;
2548         }
2549 
2550         float gphisize = gclus->getSize(1, 1);
2551         float gzsize = gclus->getSize(2, 2);
2552 
2553         // Find the matching TrkrCluster, if it exists
2554 
2555         float x = std::numeric_limits<float>::quiet_NaN();
2556         float y = std::numeric_limits<float>::quiet_NaN();
2557         float z = std::numeric_limits<float>::quiet_NaN();
2558         float r = std::numeric_limits<float>::quiet_NaN();
2559         float phi = std::numeric_limits<float>::quiet_NaN();
2560         float eta = std::numeric_limits<float>::quiet_NaN();
2561         float ex = std::numeric_limits<float>::quiet_NaN();
2562         float ey = std::numeric_limits<float>::quiet_NaN();
2563         float ez = std::numeric_limits<float>::quiet_NaN();
2564         float ephi = std::numeric_limits<float>::quiet_NaN();
2565         float adc = std::numeric_limits<float>::quiet_NaN();
2566 
2567         float nreco = 0;
2568         float phisize = 0;
2569         float zsize = 0;
2570         const auto [reco_ckey, reco_cluster] = clustereval->reco_cluster_from_truth_cluster(ckey, gclus);
2571         if (reco_cluster)
2572         {
2573           nreco = 1;
2574           // auto trkrid = TrkrDefs::getTrkrId(reco_ckey);
2575           Acts::Vector3 glob;
2576           glob = tgeometry->getGlobalPosition(reco_ckey, reco_cluster);
2577           x = glob(0);
2578           y = glob(1);
2579           z = glob(2);
2580 
2581           TVector3 pos(x, y, z);
2582           r = std::sqrt(x * x + y * y);
2583           phi = pos.Phi();
2584           eta = pos.Eta();
2585 
2586           auto para_errors = ClusterErrorPara::get_clusterv5_modified_error(reco_cluster, r, ckey);
2587           // std::cout << " ver v4 " <<  std::endl;
2588           phisize = reco_cluster->getPhiSize();
2589           zsize = reco_cluster->getZSize();
2590           ez = sqrt(para_errors.second);
2591           ephi = sqrt(para_errors.first);
2592 
2593           adc = reco_cluster->getAdc();
2594 
2595           if (Verbosity() > 1)
2596           {
2597             std::cout << "              reco cluster key " << reco_ckey << "  r " << r << "  x " << x << "  y " << y << "  z " << z << "  phi " << phi << " adc " << adc << std::endl;
2598           }
2599         }
2600         if (nreco == 0 && Verbosity() > 1)
2601         {
2602           if (Verbosity() > 1)
2603           {
2604             std::cout << "   ----------- Failed to find matching reco cluster " << std::endl;
2605           }
2606         }
2607 
2608         // add this cluster to the ntuple
2609 
2610         float g4cluster_data[] = {(float) _ievent,
2611                                   (float) local_layer,
2612                                   gx,
2613                                   gy,
2614                                   gz,
2615                                   gt,
2616                                   gedep,
2617                                   gr,
2618                                   gphi,
2619                                   geta,
2620                                   gtrackID,
2621                                   gflavor,
2622                                   gembed,
2623                                   gprimary,
2624                                   gphisize,
2625                                   gzsize,
2626                                   gadc,
2627                                   nreco,
2628                                   x,
2629                                   y,
2630                                   z,
2631                                   r,
2632                                   phi,
2633                                   eta,
2634                                   ex,
2635                                   ey,
2636                                   ez,
2637                                   ephi,
2638                                   adc,
2639                                   phisize,
2640                                   zsize};
2641         _ntp_g4cluster->Fill(g4cluster_data);
2642       }
2643     }
2644   }
2645 
2646   //------------------------
2647   // fill the Gtrack NTuple
2648   //------------------------
2649 
2650   // need things off of the DST...
2651 
2652   // std::cout << "check for ntp_gtrack" << std::endl;
2653 
2654   if (_ntp_gtrack)
2655   {
2656     if (Verbosity() > 1)
2657     {
2658       std::cout << "Filling ntp_gtrack " << std::endl;
2659       _timer->restart();
2660     }
2661     ClusterErrorPara ClusErrPara;
2662     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
2663     GlobalVertexMap* gvertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
2664     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
2665     if (!clustermap)
2666     {
2667       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
2668     }
2669 
2670     if (truthinfo)
2671     {
2672       PHG4TruthInfoContainer::ConstRange range = truthinfo->GetParticleRange();
2673       if (_scan_for_primaries)
2674       {
2675         range = truthinfo->GetPrimaryParticleRange();
2676       }
2677 
2678       Float_t gntracks = (Float_t) truthinfo->GetNumPrimaryVertexParticles();
2679       Float_t gnchghad = 0;
2680       for (auto iter = range.first; iter != range.second; ++iter)
2681       {
2682         PHG4Particle* g4particle = iter->second;
2683 
2684         if (_scan_for_embedded)
2685         {
2686           if (trutheval->get_embed(g4particle) <= 0)
2687           {
2688             continue;
2689           }
2690         }
2691 
2692         float gflavor = g4particle->get_pid();
2693         if (std::abs(gflavor) == 211 || std::abs(gflavor) == 321 || std::abs(gflavor) == 2212)
2694         {
2695           gnchghad++;
2696         }
2697       }
2698 
2699       for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
2700            iter != range.second;
2701            ++iter)
2702       {
2703         PHG4Particle* g4particle = iter->second;
2704 
2705         if (_scan_for_embedded)
2706         {
2707           if (trutheval->get_embed(g4particle) <= 0)
2708           {
2709             continue;
2710           }
2711         }
2712 
2713         float gtrackID = g4particle->get_track_id();
2714         float gflavor = g4particle->get_pid();
2715         auto g4clustermap = trutheval->all_truth_clusters(g4particle);
2716         std::set<TrkrDefs::cluskey> g4clusters;
2717         for(const auto& [key, cluster]: g4clustermap)
2718         {
2719           g4clusters.insert(key);
2720         }
2721         
2722         float ng4hits = g4clusters.size();
2723         unsigned int ngmaps = 0;
2724         unsigned int ngmms = 0;
2725         unsigned int ngintt = 0;
2726         unsigned int ngintt1 = 0;
2727         unsigned int ngintt2 = 0;
2728         unsigned int ngintt3 = 0;
2729         unsigned int ngintt4 = 0;
2730         unsigned int ngintt5 = 0;
2731         unsigned int ngintt6 = 0;
2732         unsigned int ngintt7 = 0;
2733         unsigned int ngintt8 = 0;
2734         unsigned int ngtpc = 0;
2735         unsigned int nglmaps = 0;
2736         unsigned int nglintt = 0;
2737         unsigned int ngltpc = 0;
2738         unsigned int nglmms = 0;
2739 
2740         std::vector<int> lmaps(_nlayers_maps + 1, 0);
2741         std::vector<int> lintt(_nlayers_intt + 1, 0);
2742         std::vector<int> ltpc(_nlayers_tpc + 1, 0);
2743         std::vector<int> lmms(_nlayers_mms + 1, 0);
2744 
2745         for (const TrkrDefs::cluskey g4cluster : g4clusters)
2746         {
2747           unsigned int local_layer = TrkrDefs::getLayer(g4cluster);
2748           // std::cout<<__LINE__<<": " << _ievent <<": " <<gtrackID << ": " << local_layer <<": " <<g4cluster->get_id() <<std::endl;
2749           if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
2750           {
2751             lmaps[local_layer] = 1;
2752             ngmaps++;
2753           }
2754           if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc)
2755           {
2756             lmms[local_layer - _nlayers_tpc - _nlayers_intt - _nlayers_maps] = 1;
2757             ngmms++;
2758           }
2759           if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
2760           {
2761             lintt[local_layer - _nlayers_maps] = 1;
2762             ngintt++;
2763           }
2764 
2765           if (_nlayers_intt > 0 && local_layer == _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
2766           {
2767             ngintt1++;
2768           }
2769 
2770           if (_nlayers_intt > 1 && local_layer == _nlayers_maps + 1 && local_layer < _nlayers_maps + _nlayers_intt)
2771           {
2772             ngintt2++;
2773           }
2774 
2775           if (_nlayers_intt > 2 && local_layer == _nlayers_maps + 2 && local_layer < _nlayers_maps + _nlayers_intt)
2776           {
2777             ngintt3++;
2778           }
2779 
2780           if (_nlayers_intt > 3 && local_layer == _nlayers_maps + 3 && local_layer < _nlayers_maps + _nlayers_intt)
2781           {
2782             ngintt4++;
2783           }
2784 
2785           if (_nlayers_intt > 4 && local_layer == _nlayers_maps + 4 && local_layer < _nlayers_maps + _nlayers_intt)
2786           {
2787             ngintt5++;
2788           }
2789 
2790           if (_nlayers_intt > 5 && local_layer == _nlayers_maps + 5 && local_layer < _nlayers_maps + _nlayers_intt)
2791           {
2792             ngintt6++;
2793           }
2794 
2795           if (_nlayers_intt > 6 && local_layer == _nlayers_maps + 6 && local_layer < _nlayers_maps + _nlayers_intt)
2796           {
2797             ngintt7++;
2798           }
2799 
2800           if (_nlayers_intt > 7 && local_layer == _nlayers_maps + 7 && local_layer < _nlayers_maps + _nlayers_intt)
2801           {
2802             ngintt8++;
2803           }
2804           if (_nlayers_tpc > 0 && local_layer >= _nlayers_maps + _nlayers_intt && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
2805           {
2806             ltpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
2807             ngtpc++;
2808           }
2809         }
2810         if (_nlayers_maps > 0)
2811         {
2812           for (unsigned int i = 0; i < _nlayers_maps; i++)
2813           {
2814             nglmaps += lmaps[i];
2815           }
2816         }
2817         if (_nlayers_intt > 0)
2818         {
2819           for (unsigned int i = 0; i < _nlayers_intt; i++)
2820           {
2821             nglintt += lintt[i];
2822           }
2823         }
2824         if (_nlayers_tpc > 0)
2825         {
2826           for (unsigned int i = 0; i < _nlayers_tpc; i++)
2827           {
2828             ngltpc += ltpc[i];
2829           }
2830         }
2831         if (_nlayers_mms > 0)
2832         {
2833           for (unsigned int i = 0; i < _nlayers_mms; i++)
2834           {
2835             nglmms += lmms[i];
2836           }
2837         }
2838 
2839         float gpx = g4particle->get_px();
2840         float gpy = g4particle->get_py();
2841         float gpz = g4particle->get_pz();
2842         float gpt = std::numeric_limits<float>::quiet_NaN();
2843         float geta = std::numeric_limits<float>::quiet_NaN();
2844         float gphi = std::numeric_limits<float>::quiet_NaN();
2845         if (gpx != 0 && gpy != 0)
2846         {
2847           TVector3 gv(gpx, gpy, gpz);
2848           gpt = gv.Pt();
2849           geta = gv.Eta();
2850           gphi = gv.Phi();
2851         }
2852         PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
2853         float gvx = vtx->get_x();
2854         float gvy = vtx->get_y();
2855         float gvz = vtx->get_z();
2856         float gvt = vtx->get_t();
2857 
2858         float gfpx = 0.;
2859         float gfpy = 0.;
2860         float gfpz = 0.;
2861         float gfx = 0.;
2862         float gfy = 0.;
2863         float gfz = 0.;
2864 
2865         PHG4Hit* outerhit = nullptr;
2866         if (_do_eval_light == false)
2867         {
2868           outerhit = trutheval->get_outermost_truth_hit(g4particle);
2869         }
2870 
2871         if (outerhit)
2872         {
2873           gfpx = outerhit->get_px(1);
2874           gfpy = outerhit->get_py(1);
2875           gfpz = outerhit->get_pz(1);
2876           gfx = outerhit->get_x(1);
2877           gfy = outerhit->get_y(1);
2878           gfz = outerhit->get_z(1);
2879         }
2880 
2881         float gembed = trutheval->get_embed(g4particle);
2882         float gprimary = trutheval->is_primary(g4particle);
2883 
2884         float trackID = std::numeric_limits<float>::quiet_NaN();
2885         float charge = std::numeric_limits<float>::quiet_NaN();
2886         float quality = std::numeric_limits<float>::quiet_NaN();
2887         float chisq = std::numeric_limits<float>::quiet_NaN();
2888         float ndf = std::numeric_limits<float>::quiet_NaN();
2889         float local_nhits = 0;
2890         float nmaps = 0;
2891         float nintt = 0;
2892         float ntpc = 0;
2893         float nmms = 0;
2894         float ntpc1 = 0;
2895         float ntpc11 = 0;
2896         float ntpc2 = 0;
2897         float ntpc3 = 0;
2898         float nlintt = 0;
2899         float nlmaps = 0;
2900         float nltpc = 0;
2901         float nlmms = 0;
2902         unsigned int layers = 0x0;
2903         int vertexID = -1;
2904         float vx = std::numeric_limits<float>::quiet_NaN();
2905         float vy = std::numeric_limits<float>::quiet_NaN();
2906         float vz = std::numeric_limits<float>::quiet_NaN();
2907         float dca2d = std::numeric_limits<float>::quiet_NaN();
2908         float dca2dsigma = std::numeric_limits<float>::quiet_NaN();
2909         float dca3dxy = std::numeric_limits<float>::quiet_NaN();
2910         float dca3dxysigma = std::numeric_limits<float>::quiet_NaN();
2911         float dca3dz = std::numeric_limits<float>::quiet_NaN();
2912         float dca3dzsigma = std::numeric_limits<float>::quiet_NaN();
2913         float px = std::numeric_limits<float>::quiet_NaN();
2914         float py = std::numeric_limits<float>::quiet_NaN();
2915         float pz = std::numeric_limits<float>::quiet_NaN();
2916         float pt = std::numeric_limits<float>::quiet_NaN();
2917         float eta = std::numeric_limits<float>::quiet_NaN();
2918         float phi = std::numeric_limits<float>::quiet_NaN();
2919         float deltapt = std::numeric_limits<float>::quiet_NaN();
2920         float deltaeta = std::numeric_limits<float>::quiet_NaN();
2921         float deltaphi = std::numeric_limits<float>::quiet_NaN();
2922         float pcax = std::numeric_limits<float>::quiet_NaN();
2923         float pcay = std::numeric_limits<float>::quiet_NaN();
2924         float pcaz = std::numeric_limits<float>::quiet_NaN();
2925 
2926         float nfromtruth = std::numeric_limits<float>::quiet_NaN();
2927         float nwrong = std::numeric_limits<float>::quiet_NaN();
2928         float ntrumaps = std::numeric_limits<float>::quiet_NaN();
2929         float nwrongmaps = std::numeric_limits<float>::quiet_NaN();
2930         float ntruintt = std::numeric_limits<float>::quiet_NaN();
2931         float nwrongintt = std::numeric_limits<float>::quiet_NaN();
2932         float ntrumms = std::numeric_limits<float>::quiet_NaN();
2933         float nwrongmms = std::numeric_limits<float>::quiet_NaN();
2934         float ntrutpc = std::numeric_limits<float>::quiet_NaN();
2935         float nwrongtpc = std::numeric_limits<float>::quiet_NaN();
2936         float ntrutpc1 = std::numeric_limits<float>::quiet_NaN();
2937         float nwrongtpc1 = std::numeric_limits<float>::quiet_NaN();
2938         float ntrutpc11 = std::numeric_limits<float>::quiet_NaN();
2939         float nwrongtpc11 = std::numeric_limits<float>::quiet_NaN();
2940         float ntrutpc2 = std::numeric_limits<float>::quiet_NaN();
2941         float nwrongtpc2 = std::numeric_limits<float>::quiet_NaN();
2942         float ntrutpc3 = std::numeric_limits<float>::quiet_NaN();
2943         float nwrongtpc3 = std::numeric_limits<float>::quiet_NaN();
2944         float layersfromtruth = std::numeric_limits<float>::quiet_NaN();
2945         float npedge = 0;
2946         float nredge = 0;
2947         float nbig = 0;
2948         float novlp = 0;
2949         float merr = 0;
2950         float msize = 0;
2951         float siqr = std::numeric_limits<float>::quiet_NaN();
2952         float siphi = std::numeric_limits<float>::quiet_NaN();
2953         float sithe = std::numeric_limits<float>::quiet_NaN();
2954         float six0 = std::numeric_limits<float>::quiet_NaN();
2955         float siy0 = std::numeric_limits<float>::quiet_NaN();
2956         float tpqr = std::numeric_limits<float>::quiet_NaN();
2957         float tpphi = std::numeric_limits<float>::quiet_NaN();
2958         float tpthe = std::numeric_limits<float>::quiet_NaN();
2959         float tpx0 = std::numeric_limits<float>::quiet_NaN();
2960         float tpy0 = std::numeric_limits<float>::quiet_NaN();
2961 
2962         if (_do_track_match)
2963         {
2964           SvtxTrack* track = trackeval->best_track_from(g4particle);
2965 
2966           if (track)
2967           {
2968             trackID = track->get_id();
2969             charge = track->get_charge();
2970             quality = track->get_quality();
2971             chisq = track->get_chisq();
2972             ndf = track->get_ndf();
2973             TrackSeed* silseed = track->get_silicon_seed();
2974             TrackSeed* tpcseed = track->get_tpc_seed();
2975             if (tpcseed)
2976             {
2977               local_nhits += tpcseed->size_cluster_keys();
2978             }
2979             if (silseed)
2980             {
2981               local_nhits += silseed->size_cluster_keys();
2982             }
2983             // +1 just in case _nlayers is zero
2984             std::vector<int> maps(_nlayers_maps + 1, 0);
2985             std::vector<int> intt(_nlayers_intt + 1, 0);
2986             std::vector<int> tpc(_nlayers_tpc + 1, 0);
2987             std::vector<int> mms(_nlayers_mms + 1, 0);
2988 
2989             if (tpcseed)
2990             {
2991               tpqr = tpcseed->get_qOverR();
2992               tpphi = tpcseed->get_phi();
2993               tpthe = tpcseed->get_theta();
2994               tpx0 = tpcseed->get_X0();
2995               tpy0 = tpcseed->get_Y0();
2996               for (TrackSeed::ConstClusterKeyIter local_iter = tpcseed->begin_cluster_keys();
2997                    local_iter != tpcseed->end_cluster_keys();
2998                    ++local_iter)
2999               {
3000                 TrkrDefs::cluskey cluster_key = *local_iter;
3001                 TrkrCluster* cluster = clustermap->findCluster(cluster_key);
3002                 unsigned int local_layer = TrkrDefs::getLayer(cluster_key);
3003                 if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
3004                 {
3005                   maps[local_layer] = 1;
3006                   nmaps++;
3007                 }
3008                 if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
3009                 {
3010                   intt[local_layer - _nlayers_maps] = 1;
3011                   nintt++;
3012                 }
3013                 if (_nlayers_tpc > 0 &&
3014                     local_layer >= (_nlayers_maps + _nlayers_intt) &&
3015                     local_layer < (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
3016                 {
3017                   tpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
3018                   ntpc++;
3019 
3020                   if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 8)
3021                   {
3022                     ntpc11++;
3023                   }
3024 
3025                   if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 16)
3026                   {
3027                     // std::cout << " tpc1: layer " << local_layer << std::endl;
3028                     ntpc1++;
3029                   }
3030                   else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 32)
3031                   {
3032                     // std::cout << " tpc2: layer " << local_layer << std::endl;
3033                     ntpc2++;
3034                   }
3035                   else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 48)
3036                   {
3037                     // std::cout << " tpc3: layer " << local_layer << std::endl;
3038                     ntpc3++;
3039                   }
3040                 }
3041 
3042                 if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc)
3043                 {
3044                   mms[local_layer - (_nlayers_maps + _nlayers_intt + _nlayers_tpc)] = 1;
3045                   nmms++;
3046                 }
3047 
3048                 Acts::Vector3 glob;
3049                 glob = tgeometry->getGlobalPosition(cluster_key, cluster);
3050                 float x = glob(0);
3051                 float y = glob(1);
3052                 float z = glob(2);
3053 
3054                 TVector3 pos(x, y, z);
3055                 float r = std::sqrt(x * x + y * y);
3056                 phi = pos.Phi();
3057                 eta = pos.Eta();
3058                 float gphisize = 0;
3059                 // float zsize = 0;
3060                 float gphierr = 0;
3061                 // float zerr = 0;
3062                 float govlp = 0;
3063                 float gedge = 0;
3064                 if (cluster != nullptr)
3065                 {
3066                   gphisize = cluster->getPhiSize();
3067                   // zsize = clusterv5->getZSize();
3068                   auto para_errors = ClusterErrorPara::get_clusterv5_modified_error(cluster, r, cluster_key);
3069                   // zerr = sqrt(para_errors.second);
3070                   gphierr = sqrt(para_errors.first);
3071                   govlp = cluster->getOverlap();
3072                   gedge = cluster->getEdge();
3073 
3074                   if (gedge > 0)
3075                   {
3076                     npedge++;
3077                   }
3078                   if (gphisize >= 4)
3079                   {
3080                     nbig++;
3081                   }
3082                   if (govlp >= 2)
3083                   {
3084                     novlp++;
3085                   }
3086                   merr += gphierr;
3087                   msize += gphisize;
3088                 }
3089                 if (local_layer == 7 || local_layer == 22 || local_layer == 23 || local_layer == 38 || local_layer == 39)
3090                 {
3091                   nredge++;
3092                 }
3093               }
3094             }
3095 
3096             if (silseed)
3097             {
3098               siqr = silseed->get_qOverR();
3099               siphi = silseed->get_phi();
3100               sithe = silseed->get_theta();
3101               six0 = silseed->get_X0();
3102               siy0 = silseed->get_Y0();
3103               for (TrackSeed::ConstClusterKeyIter local_iter = silseed->begin_cluster_keys();
3104                    local_iter != silseed->end_cluster_keys();
3105                    ++local_iter)
3106               {
3107                 TrkrDefs::cluskey cluster_key = *local_iter;
3108                 // TrkrCluster* cluster = clustermap->findCluster(cluster_key);
3109                 unsigned int local_layer = TrkrDefs::getLayer(cluster_key);
3110                 if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
3111                 {
3112                   maps[local_layer] = 1;
3113                   nmaps++;
3114                 }
3115                 if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
3116                 {
3117                   intt[local_layer - _nlayers_maps] = 1;
3118                   nintt++;
3119                 }
3120                 if (_nlayers_tpc > 0 &&
3121                     local_layer >= (_nlayers_maps + _nlayers_intt) &&
3122                     local_layer < (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
3123                 {
3124                   tpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
3125                   ntpc++;
3126 
3127                   if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 8)
3128                   {
3129                     ntpc11++;
3130                   }
3131 
3132                   if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 16)
3133                   {
3134                     // std::cout << " tpc1: layer " << local_layer << std::endl;
3135                     ntpc1++;
3136                   }
3137                   else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 32)
3138                   {
3139                     // std::cout << " tpc2: layer " << local_layer << std::endl;
3140                     ntpc2++;
3141                   }
3142                   else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 48)
3143                   {
3144                     // std::cout << " tpc3: layer " << local_layer << std::endl;
3145                     ntpc3++;
3146                   }
3147                 }
3148 
3149                 if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc)
3150                 {
3151                   mms[local_layer - (_nlayers_maps + _nlayers_intt + _nlayers_tpc)] = 1;
3152                   nmms++;
3153                 }
3154               }
3155             }
3156 
3157             if (_nlayers_maps > 0)
3158             {
3159               for (unsigned int i = 0; i < _nlayers_maps; i++)
3160               {
3161                 nlmaps += maps[i];
3162               }
3163             }
3164             if (_nlayers_intt > 0)
3165             {
3166               for (unsigned int i = 0; i < _nlayers_intt; i++)
3167               {
3168                 nlintt += intt[i];
3169               }
3170             }
3171             if (_nlayers_tpc > 0)
3172             {
3173               for (unsigned int i = 0; i < _nlayers_tpc; i++)
3174               {
3175                 nltpc += tpc[i];
3176               }
3177             }
3178             if (_nlayers_mms > 0)
3179             {
3180               for (unsigned int i = 0; i < _nlayers_mms; i++)
3181               {
3182                 nlmms += mms[i];
3183               }
3184             }
3185 
3186             layers = nlmaps + nlintt + nltpc + nlmms;
3187             /* std::cout << " layers " << layers
3188                  << " nmaps " << nmaps
3189                  << " nintt " << nintt
3190                  << " ntpc  " << ntpc
3191                  << " nlmaps "<< nlmaps
3192                  << " nlintt " << nlintt
3193                  << " nltpc  " << nltpc
3194                  << std::endl;
3195             */
3196 
3197             // this is the global vertex id
3198             vertexID = track->get_vertex_id();
3199 
3200             GlobalVertex* vertex = gvertexmap->get(vertexID);
3201             if (vertex)
3202             {
3203               vx = vertex->get_x();
3204               vy = vertex->get_y();
3205               vz = vertex->get_z();
3206               Acts::Vector3 vert(vx, vy, vz);
3207               auto dcapair = TrackAnalysisUtils::get_dca(track, vert);
3208               dca3dxy = dcapair.first.first;
3209               dca3dxysigma = dcapair.first.second;
3210               dca3dz = dcapair.second.first;
3211               dca3dzsigma = dcapair.second.second;
3212             }
3213 
3214             px = track->get_px();
3215             py = track->get_py();
3216             pz = track->get_pz();
3217             TVector3 v(px, py, pz);
3218             pt = v.Pt();
3219             eta = v.Eta();
3220             phi = v.Phi();
3221             float CVxx = track->get_error(3, 3);
3222             float CVxy = track->get_error(3, 4);
3223             float CVxz = track->get_error(3, 5);
3224             float CVyy = track->get_error(4, 4);
3225             float CVyz = track->get_error(4, 5);
3226             float CVzz = track->get_error(5, 5);
3227             deltapt = std::sqrt((CVxx * px * px + 2 * CVxy * px * py + CVyy * py * py) / (px * px + py * py));
3228             deltaeta = std::sqrt((CVzz * (px * px + py * py) * (px * px + py * py) + pz * (-2 * (CVxz * px + CVyz * py) * (px * px + py * py) + CVxx * px * px * pz + CVyy * py * py * pz + 2 * CVxy * px * py * pz)) / ((px * px + py * py) * (px * px + py * py) * (px * px + py * py + pz * pz)));
3229             deltaphi = std::sqrt((CVyy * px * px - 2 * CVxy * px * py + CVxx * py * py) / ((px * px + py * py) * (px * px + py * py)));
3230             pcax = track->get_x();
3231             pcay = track->get_y();
3232             pcaz = track->get_z();
3233 
3234             nfromtruth = trackeval->get_nclusters_contribution(track, g4particle);
3235             nwrong = trackeval->get_nwrongclusters_contribution(track, g4particle);
3236 
3237             if (_nlayers_maps == 0)
3238             {
3239               ntrumaps = 0;
3240             }
3241             else
3242             {
3243               auto pair = trackeval->get_layer_range_contribution(track, g4particle, 0, _nlayers_maps);
3244               ntrumaps = pair.first;
3245               nwrongmaps = pair.second;
3246             }
3247             if (_nlayers_intt == 0)
3248             {
3249               ntruintt = 0;
3250             }
3251             else
3252             {
3253               auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps, _nlayers_maps + _nlayers_intt);
3254               ntruintt = pair.first;
3255               nwrongintt = pair.second;
3256             }
3257             if (_nlayers_mms == 0)
3258             {
3259               ntrumms = 0;
3260             }
3261             else
3262             {
3263               auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + _nlayers_tpc, _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms);
3264               ntrumms = pair.first;
3265               nwrongmms = pair.second;
3266             }
3267             auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + _nlayers_tpc);
3268             ntrutpc = pair.first;
3269             nwrongtpc = pair.second;
3270             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + 16);
3271             ntrutpc1 = pair.first;
3272             nwrongtpc1 = pair.second;
3273             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + 8);
3274             ntrutpc11 = pair.first;
3275             nwrongtpc11 = pair.second;
3276             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + 16, _nlayers_maps + _nlayers_intt + 32);
3277             ntrutpc2 = pair.first;
3278             nwrongtpc2 = pair.second;
3279             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + 32, _nlayers_maps + _nlayers_intt + _nlayers_tpc);
3280             ntrutpc3 = pair.first;
3281             nwrongtpc3 = pair.first;
3282             layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track, g4particle);
3283           }
3284         }
3285 
3286         float gtrack_data[] = {(float) _ievent, m_fSeed,
3287                                gntracks,
3288                                gnchghad,
3289                                gtrackID,
3290                                gflavor,
3291                                ng4hits,
3292                                (float) ngmaps,
3293                                (float) ngintt,
3294                                (float) ngmms,
3295                                (float) ngintt1,
3296                                (float) ngintt2,
3297                                (float) ngintt3,
3298                                (float) ngintt4,
3299                                (float) ngintt5,
3300                                (float) ngintt6,
3301                                (float) ngintt7,
3302                                (float) ngintt8,
3303                                (float) ngtpc,
3304                                (float) nglmaps,
3305                                (float) nglintt,
3306                                (float) ngltpc,
3307                                (float) nglmms,
3308                                gpx,
3309                                gpy,
3310                                gpz,
3311                                gpt,
3312                                geta,
3313                                gphi,
3314                                gvx,
3315                                gvy,
3316                                gvz,
3317                                gvt,
3318                                gfpx,
3319                                gfpy,
3320                                gfpz,
3321                                gfx,
3322                                gfy,
3323                                gfz,
3324                                gembed,
3325                                gprimary,
3326                                trackID,
3327                                px,
3328                                py,
3329                                pz,
3330                                pt,
3331                                eta,
3332                                phi,
3333                                deltapt,
3334                                deltaeta,
3335                                deltaphi,
3336                                siqr,
3337                                siphi,
3338                                sithe,
3339                                six0,
3340                                siy0,
3341                                tpqr,
3342                                tpphi,
3343                                tpthe,
3344                                tpx0,
3345                                tpy0,
3346                                charge,
3347                                quality,
3348                                chisq,
3349                                ndf,
3350                                local_nhits,
3351                                (float) layers,
3352                                nmaps,
3353                                nintt,
3354                                ntpc,
3355                                nmms,
3356                                ntpc1,
3357                                ntpc11,
3358                                ntpc2,
3359                                ntpc3,
3360                                nlmaps,
3361                                nlintt,
3362                                nltpc,
3363                                nlmms,
3364                                (float) vertexID,
3365                                vx,
3366                                vy,
3367                                vz,
3368                                dca2d,
3369                                dca2dsigma,
3370                                dca3dxy,
3371                                dca3dxysigma,
3372                                dca3dz,
3373                                dca3dzsigma,
3374                                pcax,
3375                                pcay,
3376                                pcaz,
3377                                nfromtruth,
3378                                nwrong,
3379                                ntrumaps,
3380                                nwrongmaps,
3381                                ntruintt,
3382                                nwrongintt,
3383                                ntrutpc,
3384                                nwrongtpc,
3385                                ntrumms,
3386                                nwrongmms,
3387                                ntrutpc1,
3388                                nwrongtpc1,
3389                                ntrutpc11,
3390                                nwrongtpc11,
3391                                ntrutpc2,
3392                                nwrongtpc2,
3393                                ntrutpc3,
3394                                nwrongtpc3,
3395                                layersfromtruth,
3396                                npedge,
3397                                nredge,
3398                                nbig,
3399                                novlp,
3400                                merr,
3401                                msize,
3402                                nhit_tpc_all,
3403                                nhit_tpc_in,
3404                                nhit_tpc_mid,
3405                                nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
3406 
3407         /*
3408         std::cout << " ievent " << _ievent
3409              << " gtrackID " << gtrackID
3410              << " gflavor " << gflavor
3411              << " ng4hits " << ng4hits
3412              << std::endl;
3413         */
3414 
3415         _ntp_gtrack->Fill(gtrack_data);
3416       }
3417     }
3418     if (Verbosity() > 1)
3419     {
3420       _timer->stop();
3421       std::cout << "gtrack time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
3422     }
3423   }
3424 
3425   //------------------------
3426   // fill the Track NTuple
3427   //------------------------
3428 
3429   if (_ntp_track)
3430   {
3431     if (Verbosity() > 1)
3432     {
3433       std::cout << "Filling ntp_track " << std::endl;
3434       _timer->restart();
3435     }
3436 
3437     // need things off of the DST...
3438     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
3439 
3440     GlobalVertexMap* gvertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
3441     TrkrClusterContainer* clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
3442     if (!clustermap)
3443     {
3444       clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
3445     }
3446     ClusterErrorPara ClusErrPara;
3447     if (trackmap)
3448     {
3449       for (auto& iter : *trackmap)
3450       {
3451         SvtxTrack* track = iter.second;
3452         float trackID = track->get_id();
3453 
3454         TrackSeed* tpcseed = track->get_tpc_seed();
3455         TrackSeed* silseed = track->get_silicon_seed();
3456         short int crossing_int = track->get_crossing();
3457         float crossing;
3458         if (crossing_int == SHRT_MAX)
3459         {
3460           crossing = std::numeric_limits<float>::quiet_NaN();
3461         }
3462         else
3463         {
3464           crossing = (float) crossing_int;
3465         }
3466         float charge = track->get_charge();
3467         float quality = track->get_quality();
3468         float chisq = track->get_chisq();
3469         float ndf = track->get_ndf();
3470         float local_nhits = 0;
3471         if (tpcseed)
3472         {
3473           local_nhits += tpcseed->size_cluster_keys();
3474         }
3475         if (silseed)
3476         {
3477           local_nhits += silseed->size_cluster_keys();
3478         }
3479         unsigned int layers = 0x0;
3480         // +1 just in case _nlayers is zero
3481         std::vector<int> maps(_nlayers_maps + 1, 0);
3482         std::vector<int> intt(_nlayers_intt + 1, 0);
3483         std::vector<int> tpc(_nlayers_tpc + 1, 0);
3484         std::vector<int> mms(_nlayers_mms + 1, 0);
3485 
3486         float nmaps = 0;
3487         float nintt = 0;
3488         float nmms = 0;
3489         float ntpc = 0;
3490         float ntpc1 = 0;
3491         float ntpc11 = 0;
3492         float ntpc2 = 0;
3493         float ntpc3 = 0;
3494         float nlmaps = 0;
3495         float nlintt = 0;
3496         float nltpc = 0;
3497         float nlmms = 0;
3498         float npedge = 0;
3499         float nredge = 0;
3500         float nbig = 0;
3501         float novlp = 0;
3502         float merr = 0;
3503         float msize = 0;
3504         float siqr = std::numeric_limits<float>::quiet_NaN();
3505         float siphi = std::numeric_limits<float>::quiet_NaN();
3506         float sithe = std::numeric_limits<float>::quiet_NaN();
3507         float six0 = std::numeric_limits<float>::quiet_NaN();
3508         float siy0 = std::numeric_limits<float>::quiet_NaN();
3509         float tpqr = std::numeric_limits<float>::quiet_NaN();
3510         float tpphi = std::numeric_limits<float>::quiet_NaN();
3511         float tpthe = std::numeric_limits<float>::quiet_NaN();
3512         float tpx0 = std::numeric_limits<float>::quiet_NaN();
3513         float tpy0 = std::numeric_limits<float>::quiet_NaN();
3514 
3515         if (tpcseed)
3516         {
3517           tpqr = tpcseed->get_qOverR();
3518           tpphi = tpcseed->get_phi();
3519           tpthe = tpcseed->get_theta();
3520           tpx0 = tpcseed->get_X0();
3521           tpy0 = tpcseed->get_Y0();
3522           for (SvtxTrack::ConstClusterKeyIter local_iter = tpcseed->begin_cluster_keys();
3523                local_iter != tpcseed->end_cluster_keys();
3524                ++local_iter)
3525           {
3526             TrkrDefs::cluskey cluster_key = *local_iter;
3527             TrkrCluster* cluster = clustermap->findCluster(cluster_key);
3528             unsigned int local_layer = TrkrDefs::getLayer(cluster_key);
3529 
3530             if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
3531             {
3532               maps[local_layer] = 1;
3533               nmaps++;
3534             }
3535             if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
3536             {
3537               intt[local_layer - _nlayers_maps] = 1;
3538               nintt++;
3539             }
3540             if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms)
3541             {
3542               mms[local_layer - (_nlayers_maps + _nlayers_intt + _nlayers_tpc)] = 1;
3543               nmms++;
3544             }
3545             if (_nlayers_tpc > 0 && local_layer >= (_nlayers_maps + _nlayers_intt) && local_layer < (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
3546             {
3547               tpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
3548               ntpc++;
3549               if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 8)
3550               {
3551                 ntpc11++;
3552               }
3553 
3554               if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 16)
3555               {
3556                 ntpc1++;
3557               }
3558               else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 32)
3559               {
3560                 ntpc2++;
3561               }
3562               else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 48)
3563               {
3564                 ntpc3++;
3565               }
3566             }
3567 
3568             Acts::Vector3 glob;
3569             glob = tgeometry->getGlobalPosition(cluster_key, cluster);
3570             float x = glob(0);
3571             float y = glob(1);
3572             float z = glob(2);
3573 
3574             TVector3 pos(x, y, z);
3575             float r = std::sqrt(x * x + y * y);
3576             // float phi = pos.Phi();
3577             // float eta = pos.Eta();
3578             float rphisize = 0;
3579             // float zsize = 0;
3580             float rphierr = 0;
3581             // float zerr = 0;
3582             float rovlp = 0;
3583             float pedge = 0;
3584             if (cluster != nullptr)
3585             {
3586               rphisize = cluster->getPhiSize();
3587               // zsize = clusterv5->getZSize();
3588               auto para_errors = ClusterErrorPara::get_clusterv5_modified_error(cluster, r, cluster_key);
3589               // zerr = sqrt(para_errors.second);
3590               rphierr = sqrt(para_errors.first);
3591               rovlp = cluster->getOverlap();
3592               pedge = cluster->getEdge();
3593 
3594               if (pedge > 0)
3595               {
3596                 npedge++;
3597               }
3598               if (rphisize >= 4)
3599               {
3600                 nbig++;
3601               }
3602               if (rovlp >= 2)
3603               {
3604                 novlp++;
3605               }
3606               merr += rphierr;
3607               msize += rphisize;
3608             }
3609             if (local_layer == 7 || local_layer == 22 || local_layer == 23 || local_layer == 38 || local_layer == 39)
3610             {
3611               nredge++;
3612             }
3613             if (Verbosity() > 2)
3614             {
3615               std::cout << " lay: " << local_layer
3616                         << " pedge " << pedge
3617                         << " | " << npedge
3618                         << " nredge " << nredge
3619                         << " rphisize " << rphisize
3620                         << " | " << nbig
3621                         << " rovlp " << rovlp
3622                         << "  | " << novlp
3623                         << std::endl;
3624             }
3625           }
3626         }
3627 
3628         if (silseed)
3629         {
3630           siqr = silseed->get_qOverR();
3631           siphi = silseed->get_phi();
3632           sithe = silseed->get_theta();
3633           six0 = silseed->get_X0();
3634           siy0 = silseed->get_Y0();
3635           for (SvtxTrack::ConstClusterKeyIter local_iter = silseed->begin_cluster_keys();
3636                local_iter != silseed->end_cluster_keys();
3637                ++local_iter)
3638           {
3639             TrkrDefs::cluskey cluster_key = *local_iter;
3640             // TrkrCluster* cluster = clustermap->findCluster(cluster_key);
3641             unsigned int local_layer = TrkrDefs::getLayer(cluster_key);
3642 
3643             if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
3644             {
3645               maps[local_layer] = 1;
3646               nmaps++;
3647             }
3648             if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
3649             {
3650               intt[local_layer - _nlayers_maps] = 1;
3651               nintt++;
3652             }
3653             if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms)
3654             {
3655               mms[local_layer - (_nlayers_maps + _nlayers_intt + _nlayers_tpc)] = 1;
3656               nmms++;
3657             }
3658             if (_nlayers_tpc > 0 && local_layer >= (_nlayers_maps + _nlayers_intt) && local_layer < (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
3659             {
3660               tpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
3661               ntpc++;
3662               if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 8)
3663               {
3664                 ntpc11++;
3665               }
3666 
3667               if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 16)
3668               {
3669                 ntpc1++;
3670               }
3671               else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 32)
3672               {
3673                 ntpc2++;
3674               }
3675               else if ((local_layer - (_nlayers_maps + _nlayers_intt)) < 48)
3676               {
3677                 ntpc3++;
3678               }
3679             }
3680           }
3681         }
3682 
3683         if (_nlayers_maps > 0)
3684         {
3685           for (unsigned int i = 0; i < _nlayers_maps; i++)
3686           {
3687             nlmaps += maps[i];
3688           }
3689         }
3690         if (_nlayers_intt > 0)
3691         {
3692           for (unsigned int i = 0; i < _nlayers_intt; i++)
3693           {
3694             nlintt += intt[i];
3695           }
3696         }
3697         if (_nlayers_tpc > 0)
3698         {
3699           for (unsigned int i = 0; i < _nlayers_tpc; i++)
3700           {
3701             nltpc += tpc[i];
3702           }
3703         }
3704         if (_nlayers_mms > 0)
3705         {
3706           for (unsigned int i = 0; i < _nlayers_mms; i++)
3707           {
3708             nlmms += mms[i];
3709           }
3710         }
3711         layers = nlmaps + nlintt + nltpc + nlmms;
3712 
3713         float dca3dxy = std::numeric_limits<float>::quiet_NaN();
3714         float dca3dz = std::numeric_limits<float>::quiet_NaN();
3715         float dca3dxysigma = std::numeric_limits<float>::quiet_NaN();
3716         float dca3dzsigma = std::numeric_limits<float>::quiet_NaN();
3717         float dca2d = std::numeric_limits<float>::quiet_NaN();
3718         float dca2dsigma = std::numeric_limits<float>::quiet_NaN();
3719 
3720         /// this is the global vertex
3721         int vertexID = track->get_vertex_id();
3722         GlobalVertex* vertex = gvertexmap->get(vertexID);
3723         float vx = std::numeric_limits<float>::quiet_NaN();
3724         float vy = std::numeric_limits<float>::quiet_NaN();
3725         float vz = std::numeric_limits<float>::quiet_NaN();
3726         if (vertex)
3727         {
3728           vx = vertex->get_x();
3729           vy = vertex->get_y();
3730           vz = vertex->get_z();
3731           Acts::Vector3 vert(vx, vy, vz);
3732 
3733           auto dcapair = TrackAnalysisUtils::get_dca(track, vert);
3734           dca3dxy = dcapair.first.first;
3735           dca3dxysigma = dcapair.first.second;
3736           dca3dz = dcapair.second.first;
3737           dca3dzsigma = dcapair.second.second;
3738         }
3739         float px = track->get_px();
3740         float py = track->get_py();
3741         float pz = track->get_pz();
3742         TVector3 v(px, py, pz);
3743         float pt = v.Pt();
3744         float eta = v.Eta();
3745         float phi = v.Phi();
3746         float CVxx = track->get_error(3, 3);
3747         float CVxy = track->get_error(3, 4);
3748         float CVxz = track->get_error(3, 5);
3749         float CVyy = track->get_error(4, 4);
3750         float CVyz = track->get_error(4, 5);
3751         float CVzz = track->get_error(5, 5);
3752         float deltapt = std::sqrt((CVxx * px * px + 2 * CVxy * px * py + CVyy * py * py) / (px * px + py * py));
3753         float deltaeta = std::sqrt((CVzz * (px * px + py * py) * (px * px + py * py) + pz * (-2 * (CVxz * px + CVyz * py) * (px * px + py * py) + CVxx * px * px * pz + CVyy * py * py * pz + 2 * CVxy * px * py * pz)) / ((px * px + py * py) * (px * px + py * py) * (px * px + py * py + pz * pz)));
3754         float deltaphi = std::sqrt((CVyy * px * px - 2 * CVxy * px * py + CVxx * py * py) / ((px * px + py * py) * (px * px + py * py)));
3755         float pcax = track->get_x();
3756         float pcay = track->get_y();
3757         float pcaz = track->get_z();
3758 
3759         float gtrackID = std::numeric_limits<float>::quiet_NaN();
3760         float gflavor = std::numeric_limits<float>::quiet_NaN();
3761         float ng4hits = std::numeric_limits<float>::quiet_NaN();
3762         unsigned int ngmaps = 0;
3763         unsigned int ngintt = 0;
3764         unsigned int ngmms = 0;
3765         unsigned int ngtpc = 0;
3766         unsigned int nglmaps = 0;
3767         unsigned int nglintt = 0;
3768         unsigned int nglmms = 0;
3769         unsigned int ngltpc = 0;
3770         float gpx = std::numeric_limits<float>::quiet_NaN();
3771         float gpy = std::numeric_limits<float>::quiet_NaN();
3772         float gpt = std::numeric_limits<float>::quiet_NaN();
3773         float geta = std::numeric_limits<float>::quiet_NaN();
3774         float gphi = std::numeric_limits<float>::quiet_NaN();
3775         float gpz = std::numeric_limits<float>::quiet_NaN();
3776         float gvx = std::numeric_limits<float>::quiet_NaN();
3777         float gvy = std::numeric_limits<float>::quiet_NaN();
3778         float gvz = std::numeric_limits<float>::quiet_NaN();
3779         float gvt = std::numeric_limits<float>::quiet_NaN();
3780         float gfpx = std::numeric_limits<float>::quiet_NaN();
3781         float gfpy = std::numeric_limits<float>::quiet_NaN();
3782         float gfpz = std::numeric_limits<float>::quiet_NaN();
3783         float gfx = std::numeric_limits<float>::quiet_NaN();
3784         float gfy = std::numeric_limits<float>::quiet_NaN();
3785         float gfz = std::numeric_limits<float>::quiet_NaN();
3786         float gembed = std::numeric_limits<float>::quiet_NaN();
3787         float gprimary = std::numeric_limits<float>::quiet_NaN();
3788 
3789         int ispure = 0;
3790         float nfromtruth = std::numeric_limits<float>::quiet_NaN();
3791         float nwrong = std::numeric_limits<float>::quiet_NaN();
3792         float ntrumaps = std::numeric_limits<float>::quiet_NaN();
3793         float nwrongmaps = std::numeric_limits<float>::quiet_NaN();
3794         float ntruintt = std::numeric_limits<float>::quiet_NaN();
3795         float nwrongintt = std::numeric_limits<float>::quiet_NaN();
3796         float ntrumms = std::numeric_limits<float>::quiet_NaN();
3797         float nwrongmms = std::numeric_limits<float>::quiet_NaN();
3798         float ntrutpc = std::numeric_limits<float>::quiet_NaN();
3799         float nwrongtpc = std::numeric_limits<float>::quiet_NaN();
3800         float ntrutpc1 = std::numeric_limits<float>::quiet_NaN();
3801         float nwrongtpc1 = std::numeric_limits<float>::quiet_NaN();
3802         float ntrutpc11 = std::numeric_limits<float>::quiet_NaN();
3803         float nwrongtpc11 = std::numeric_limits<float>::quiet_NaN();
3804         float ntrutpc2 = std::numeric_limits<float>::quiet_NaN();
3805         float nwrongtpc2 = std::numeric_limits<float>::quiet_NaN();
3806         float ntrutpc3 = std::numeric_limits<float>::quiet_NaN();
3807         float nwrongtpc3 = std::numeric_limits<float>::quiet_NaN();
3808         float layersfromtruth = std::numeric_limits<float>::quiet_NaN();
3809 
3810         if (_do_track_match)
3811         {
3812           PHG4Particle* g4particle = trackeval->max_truth_particle_by_nclusters(track);
3813           if (g4particle)
3814           {
3815             if (_scan_for_embedded)
3816             {
3817               if (trutheval->get_embed(g4particle) <= 0)
3818               {
3819                 continue;
3820               }
3821             }
3822             SvtxTrack* truthrecotrk = trackeval->best_track_from(g4particle);
3823             if (truthrecotrk)
3824             {
3825               if (truthrecotrk->get_id() == track->get_id())
3826               {
3827                 ispure = 1;
3828               }
3829             }
3830             gtrackID = g4particle->get_track_id();
3831             gflavor = g4particle->get_pid();
3832 
3833             std::set<TrkrDefs::cluskey> g4clusters = clustereval->all_clusters_from(g4particle);
3834             ng4hits = g4clusters.size();
3835             gpx = g4particle->get_px();
3836             gpy = g4particle->get_py();
3837             gpz = g4particle->get_pz();
3838 
3839             std::vector<int> lmaps(_nlayers_maps + 1, 0);
3840             std::vector<int> lintt(_nlayers_intt + 1, 0);
3841             std::vector<int> ltpc(_nlayers_tpc + 1, 0);
3842             std::vector<int> lmms(_nlayers_mms + 1, 0);
3843 
3844             for (const TrkrDefs::cluskey g4cluster : g4clusters)
3845             {
3846               unsigned int local_layer = TrkrDefs::getLayer(g4cluster);
3847               if (_nlayers_maps > 0 && local_layer < _nlayers_maps)
3848               {
3849                 lmaps[local_layer] = 1;
3850                 ngmaps++;
3851               }
3852 
3853               if (_nlayers_intt > 0 && local_layer >= _nlayers_maps && local_layer < _nlayers_maps + _nlayers_intt)
3854               {
3855                 lintt[local_layer - _nlayers_maps] = 1;
3856                 ngintt++;
3857               }
3858 
3859               if (_nlayers_tpc > 0 && local_layer >= _nlayers_maps + _nlayers_intt && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
3860               {
3861                 ltpc[local_layer - (_nlayers_maps + _nlayers_intt)] = 1;
3862                 ngtpc++;
3863               }
3864 
3865               if (_nlayers_mms > 0 && local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc && local_layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms)
3866               {
3867                 lmms[local_layer - (_nlayers_maps + _nlayers_intt + _nlayers_tpc)] = 1;
3868                 ngmms++;
3869               }
3870             }
3871             if (_nlayers_maps > 0)
3872             {
3873               for (unsigned int i = 0; i < _nlayers_maps; i++)
3874               {
3875                 nglmaps += lmaps[i];
3876               }
3877             }
3878             if (_nlayers_intt > 0)
3879             {
3880               for (unsigned int i = 0; i < _nlayers_intt; i++)
3881               {
3882                 nglintt += lintt[i];
3883               }
3884             }
3885             if (_nlayers_tpc > 0)
3886             {
3887               for (unsigned int i = 0; i < _nlayers_tpc; i++)
3888               {
3889                 ngltpc += ltpc[i];
3890               }
3891             }
3892             if (_nlayers_mms > 0)
3893             {
3894               for (unsigned int i = 0; i < _nlayers_mms; i++)
3895               {
3896                 nglmms += lmms[i];
3897               }
3898             }
3899 
3900             TVector3 gv(gpx, gpy, gpz);
3901             gpt = gv.Pt();
3902             geta = gv.Eta();
3903             gphi = gv.Phi();
3904             PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
3905             gvx = vtx->get_x();
3906             gvy = vtx->get_y();
3907             gvz = vtx->get_z();
3908             gvt = vtx->get_t();
3909 
3910             PHG4Hit* outerhit = nullptr;
3911             if (_do_eval_light == false)
3912             {
3913               outerhit = trutheval->get_outermost_truth_hit(g4particle);
3914             }
3915             if (outerhit)
3916             {
3917               gfpx = outerhit->get_px(1);
3918               gfpy = outerhit->get_py(1);
3919               gfpz = outerhit->get_pz(1);
3920               gfx = outerhit->get_x(1);
3921               gfy = outerhit->get_y(1);
3922               gfz = outerhit->get_z(1);
3923             }
3924             gembed = trutheval->get_embed(g4particle);
3925             gprimary = trutheval->is_primary(g4particle);
3926 
3927             nfromtruth = trackeval->get_nclusters_contribution(track, g4particle);
3928             nwrong = trackeval->get_nwrongclusters_contribution(track, g4particle);
3929             if (_nlayers_maps == 0)
3930             {
3931               ntrumaps = 0;
3932             }
3933             else
3934             {
3935               auto pair = trackeval->get_layer_range_contribution(track, g4particle, 0, _nlayers_maps);
3936               ntrumaps = pair.first;
3937               nwrongmaps = pair.second;
3938             }
3939             if (_nlayers_intt == 0)
3940             {
3941               ntruintt = 0;
3942             }
3943             else
3944             {
3945               auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps, _nlayers_maps + _nlayers_intt);
3946               ntruintt = pair.first;
3947               nwrongintt = pair.second;
3948             }
3949             if (_nlayers_mms == 0)
3950             {
3951               ntrumms = 0;
3952             }
3953             else
3954             {
3955               auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + _nlayers_tpc, _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms);
3956               ntrumms = pair.first;
3957               nwrongmms = pair.second;
3958             }
3959             auto pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + _nlayers_tpc);
3960             ntrutpc = pair.first;
3961             nwrongtpc = pair.second;
3962             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + 16);
3963             ntrutpc1 = pair.first;
3964             nwrongtpc1 = pair.second;
3965             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt, _nlayers_maps + _nlayers_intt + 8);
3966             ntrutpc11 = pair.first;
3967             nwrongtpc11 = pair.second;
3968             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + 16, _nlayers_maps + _nlayers_intt + 32);
3969             ntrutpc2 = pair.first;
3970             nwrongtpc2 = pair.second;
3971             pair = trackeval->get_layer_range_contribution(track, g4particle, _nlayers_maps + _nlayers_intt + 32, _nlayers_maps + _nlayers_intt + _nlayers_tpc);
3972             ntrutpc3 = pair.first;
3973             nwrongtpc3 = pair.second;
3974             layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track, g4particle);
3975           }
3976         }
3977         if (Verbosity() > 2)
3978         {
3979           std::cout << " npedge " << npedge
3980                     << " nredge " << nredge
3981                     << " nbig " << nbig
3982                     << " novlp " << novlp
3983                     << std::endl;
3984         }
3985         float track_data[] = {(float) _ievent, m_fSeed,
3986                               trackID,
3987                               crossing,
3988                               px,
3989                               py,
3990                               pz,
3991                               pt,
3992                               eta,
3993                               phi,
3994                               deltapt,
3995                               deltaeta,
3996                               deltaphi,
3997                               siqr,
3998                               siphi,
3999                               sithe,
4000                               six0,
4001                               siy0,
4002                               tpqr,
4003                               tpphi,
4004                               tpthe,
4005                               tpx0,
4006                               tpy0,
4007                               charge,
4008                               quality,
4009                               chisq,
4010                               ndf,
4011                               local_nhits, nmaps, nintt, ntpc, nmms,
4012                               ntpc1, ntpc11, ntpc2, ntpc3,
4013                               nlmaps, nlintt, nltpc, nlmms,
4014                               (float) layers,
4015                               (float) vertexID,
4016                               vx,
4017                               vy,
4018                               vz,
4019                               dca2d,
4020                               dca2dsigma,
4021                               dca3dxy,
4022                               dca3dxysigma,
4023                               dca3dz,
4024                               dca3dzsigma,
4025                               pcax,
4026                               pcay,
4027                               pcaz,
4028                               gtrackID,
4029                               (float) ispure,
4030                               gflavor,
4031                               ng4hits,
4032                               (float) ngmaps,
4033                               (float) ngintt,
4034                               (float) ngtpc,
4035                               (float) ngmms,
4036                               (float) nglmaps,
4037                               (float) nglintt,
4038                               (float) ngltpc,
4039                               (float) nglmms,
4040                               gpx,
4041                               gpy,
4042                               gpz,
4043                               gpt,
4044                               geta,
4045                               gphi,
4046                               gvx,
4047                               gvy,
4048                               gvz,
4049                               gvt,
4050                               gfpx,
4051                               gfpy,
4052                               gfpz,
4053                               gfx,
4054                               gfy,
4055                               gfz,
4056                               gembed,
4057                               gprimary,
4058                               nfromtruth,
4059                               nwrong,
4060                               ntrumaps,
4061                               nwrongmaps,
4062                               ntruintt,
4063                               nwrongintt,
4064                               ntrutpc,
4065                               nwrongtpc,
4066                               ntrumms,
4067                               nwrongmms,
4068                               ntrutpc1,
4069                               nwrongtpc1,
4070                               ntrutpc11,
4071                               nwrongtpc11,
4072                               ntrutpc2,
4073                               nwrongtpc2,
4074                               ntrutpc3,
4075                               nwrongtpc3,
4076                               layersfromtruth,
4077                               npedge,
4078                               nredge,
4079                               nbig,
4080                               novlp,
4081                               merr,
4082                               msize,
4083                               nhit_tpc_all,
4084                               nhit_tpc_in,
4085                               nhit_tpc_mid,
4086                               nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
4087 
4088         if (Verbosity() >= 1)
4089         {
4090           std::cout << "ievent " << _ievent
4091                     << " trackID " << trackID
4092                     << " nhits " << local_nhits
4093                     << " px " << px
4094                     << " py " << py
4095                     << " pz " << pz
4096                     << " gembed " << gembed
4097                     << " gprimary " << gprimary
4098                     << std::endl;
4099         }
4100 
4101         _ntp_track->Fill(track_data);
4102       }
4103     }
4104     if (Verbosity() > 1)
4105     {
4106       _timer->stop();
4107       std::cout << "track time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
4108     }
4109   }
4110 
4111   //---------------------
4112   // fill the Gseed NTuple
4113   //---------------------
4114 
4115   if (_ntp_gseed)
4116   {
4117     if (Verbosity() > 1)
4118     {
4119       std::cout << "Filling ntp_gseed " << std::endl;
4120       _timer->restart();
4121     }
4122 
4123     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
4124 
4125     float gx = std::numeric_limits<float>::quiet_NaN();
4126     float gy = std::numeric_limits<float>::quiet_NaN();
4127     float gz = std::numeric_limits<float>::quiet_NaN();
4128     float gr = std::numeric_limits<float>::quiet_NaN();
4129     float geta = std::numeric_limits<float>::quiet_NaN();
4130     float gphi = std::numeric_limits<float>::quiet_NaN();
4131     float glayer = std::numeric_limits<float>::quiet_NaN();
4132     float gpx = std::numeric_limits<float>::quiet_NaN();
4133     float gpy = std::numeric_limits<float>::quiet_NaN();
4134     float gpz = std::numeric_limits<float>::quiet_NaN();
4135     float gtpt = std::numeric_limits<float>::quiet_NaN();
4136     float gtphi = std::numeric_limits<float>::quiet_NaN();
4137     float gteta = std::numeric_limits<float>::quiet_NaN();
4138     float gvx = std::numeric_limits<float>::quiet_NaN();
4139     float gvy = std::numeric_limits<float>::quiet_NaN();
4140     float gvz = std::numeric_limits<float>::quiet_NaN();
4141     float gembed = std::numeric_limits<float>::quiet_NaN();
4142     float gprimary = std::numeric_limits<float>::quiet_NaN();
4143     float gflav = std::numeric_limits<float>::quiet_NaN();
4144     float dphiprev = std::numeric_limits<float>::quiet_NaN();
4145     float detaprev = std::numeric_limits<float>::quiet_NaN();
4146 
4147     float* xval = new float[_nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms];
4148     float* yval = new float[_nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms];
4149     float* zval = new float[_nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms];
4150     if (truthinfo)
4151     {
4152       int ntrk = 0;
4153       PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange();
4154       for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
4155            iter != range.second;
4156            ++iter)
4157       {
4158         ntrk++;
4159         PHG4Particle* g4particle = iter->second;
4160         for (unsigned int i = 0; i < _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms; i++)
4161         {
4162           xval[i] = 0;
4163           yval[i] = 0;
4164           zval[i] = 0;
4165         }
4166         std::set<PHG4Hit*> truth_hits = trutheval->all_truth_hits(g4particle);
4167         for (auto* g4hit : truth_hits)
4168         {
4169           unsigned int local_layer = g4hit->get_layer();
4170           // std::cout << "  g4hit " << g4hit->get_hit_id() << " layer = " << local_layer << std::endl;
4171           if (local_layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms)
4172           {
4173             // std::cout << PHWHERE << " skipping out of bounds detector id " << local_layer << std::endl;
4174             continue;
4175           }
4176           xval[local_layer] = g4hit->get_avg_x();
4177           yval[local_layer] = g4hit->get_avg_y();
4178           zval[local_layer] = g4hit->get_avg_z();
4179         }
4180 
4181         for (unsigned int i = 0; i < _nlayers_maps + _nlayers_intt + _nlayers_tpc + _nlayers_mms; i++)
4182         {
4183           gx = xval[i];
4184           gy = yval[i];
4185           gz = zval[i];
4186           if (gx == 0 && gy == 0)
4187           {
4188             continue;
4189           }
4190 
4191           TVector3 vg4(gx, gy, gz);
4192           glayer = i;
4193           gr = vg4.Perp();
4194           geta = vg4.Eta();
4195           gphi = vg4.Phi();
4196           gpx = g4particle->get_px();
4197           gpy = g4particle->get_py();
4198           gpz = g4particle->get_pz();
4199           TVector3 vg4p(gpx, gpy, gpz);
4200 
4201           gtpt = vg4p.Perp();
4202           gtphi = vg4p.Phi();
4203           gteta = vg4p.Eta();
4204 
4205           PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
4206 
4207           if (vtx)
4208           {
4209             gvx = vtx->get_x();
4210             gvy = vtx->get_y();
4211             gvz = vtx->get_z();
4212           }
4213 
4214           gembed = trutheval->get_embed(g4particle);
4215           gprimary = trutheval->is_primary(g4particle);
4216           gflav = g4particle->get_pid();
4217           if (i >= 1)
4218           {
4219             if (xval[i - 1] != 0 && yval[i - 1] != 0)
4220             {
4221               TVector3 vg4prev(xval[i - 1], yval[i - 1], zval[i - 1]);
4222               dphiprev = vg4.DeltaPhi(vg4prev);
4223               detaprev = geta - vg4prev.Eta();
4224             }
4225           }
4226 
4227           float ntrk_f = ntrk;
4228           float _ievent_f = _ievent;
4229           float gseed_data[] = {_ievent_f,
4230                                 ntrk_f,
4231                                 gx,
4232                                 gy,
4233                                 gz,
4234                                 gr,
4235                                 geta,
4236                                 gphi,
4237                                 glayer,
4238                                 gpx,
4239                                 gpy,
4240                                 gpz,
4241                                 gtpt,
4242                                 gtphi,
4243                                 gteta,
4244                                 gvx,
4245                                 gvy,
4246                                 gvz,
4247                                 gembed,
4248                                 gprimary,
4249                                 gflav,
4250                                 dphiprev,
4251                                 detaprev,
4252                                 nhit_tpc_all,
4253                                 nhit_tpc_in,
4254                                 nhit_tpc_mid,
4255                                 nhit_tpc_out, nclus_all, nclus_tpc, nclus_intt, nclus_maps, nclus_mms};
4256 
4257           _ntp_gseed->Fill(gseed_data);
4258         }
4259         delete[] xval;
4260         delete[] yval;
4261         delete[] zval;
4262       }
4263     }
4264 
4265     if (Verbosity() > 1)
4266     {
4267       _timer->stop();
4268       std::cout << "g4hit time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
4269     }
4270   }
4271   return;
4272 }
4273 
4274 TMatrixF SvtxEvaluator::calculateClusterError(TrkrCluster* c, float& clusphi)
4275 {
4276   TMatrixF localErr(3, 3);
4277   localErr[0][0] = 0.;
4278   localErr[0][1] = 0.;
4279   localErr[0][2] = 0.;
4280   localErr[1][0] = 0.;
4281   localErr[1][1] = c->getActsLocalError(0, 0);
4282   localErr[1][2] = c->getActsLocalError(0, 1);
4283   localErr[2][0] = 0.;
4284   localErr[2][1] = c->getActsLocalError(1, 0);
4285   localErr[2][2] = c->getActsLocalError(1, 1);
4286 
4287   TMatrixF ROT(3, 3);
4288   ROT[0][0] = std::cos(clusphi);
4289   ROT[0][1] = -std::sin(clusphi);
4290   ROT[0][2] = 0.0;
4291   ROT[1][0] = std::sin(clusphi);
4292   ROT[1][1] = std::cos(clusphi);
4293   ROT[1][2] = 0.0;
4294   ROT[2][0] = 0.0;
4295   ROT[2][1] = 0.0;
4296   ROT[2][2] = 1.0;
4297   TMatrixF ROT_T(3, 3);
4298   ROT_T.Transpose(ROT);
4299 
4300   TMatrixF err(3, 3);
4301   err = ROT * localErr * ROT_T;
4302   return err;
4303 }