Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:18:21

0001 #include "TrkrNtuplizer.h"
0002 
0003 #include <trackbase/ActsGeometry.h>
0004 #include <trackbase/ClusterErrorPara.h>
0005 #include <trackbase/TrackFitUtils.h>
0006 #include <trackbase/TrkrCluster.h>
0007 #include <trackbase/TrkrDefs.h>
0008 #include <trackbase/TrkrHit.h>
0009 #include <trackbase/TrkrHitSetContainer.h>
0010 #include <trackbase/InttDefs.h>
0011 #include <trackbase/MvtxDefs.h>
0012 #include <trackbase/TpcDefs.h>
0013 #include <trackbase/TrkrClusterContainer.h>
0014 #include <trackbase/TrkrClusterHitAssoc.h>
0015 #include <trackbase/TrkrClusterIterationMapv1.h>
0016 #include <trackbase/TrkrHitSet.h>
0017 
0018 #include <trackbase_historic/TrackSeedContainer_v1.h>
0019 #include <trackbase_historic/ActsTransformations.h>
0020 #include <trackbase_historic/SvtxTrack.h>
0021 #include <trackbase_historic/SvtxTrackMap.h>
0022 #include <trackbase_historic/TrackAnalysisUtils.h>
0023 #include <trackbase_historic/TrackSeed.h>
0024 
0025 #include <micromegas/MicromegasDefs.h>
0026 
0027 
0028 #include <globalvertex/GlobalVertex.h>
0029 #include <globalvertex/GlobalVertexMap.h>
0030 #include <globalvertex/SvtxVertex.h>
0031 #include <globalvertex/SvtxVertexMap.h>
0032 
0033 
0034 #include <g4detectors/PHG4TpcCylinderGeom.h>
0035 #include <g4detectors/PHG4TpcCylinderGeomContainer.h>
0036 
0037 #include <trackermillepedealignment/HelicalFitter.h>
0038 
0039 #include <ffamodules/CDBInterface.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 <cmath>
0054 #include <iomanip>
0055 #include <iostream>
0056 #include <iterator>
0057 #include <map>
0058 #include <memory>  // for shared_ptr
0059 #include <set>     // for _Rb_tree_cons...
0060 #include <utility>
0061 #include <vector>
0062 
0063 enum n_event // NOLINT(readability-enum-initial-value, performance-enum-size)
0064 {
0065   evnev,
0066   evnseed,
0067   evnrun,
0068   evnseg,
0069   evnjob,
0070   evsize = evnjob + 1,
0071 };
0072 
0073 enum n_info // NOLINT(readability-enum-initial-value, performance-enum-size)
0074 {
0075   infonocc11,
0076   infonocc116,
0077   infonocc21,
0078   infonocc216,
0079   infonocc31,
0080   infonocc316,
0081   infontrk,
0082   infonntpcseed,
0083   infonnsiseed,
0084   infonhitmvtx,
0085   infonhitintt,
0086   infonhittpot,
0087   infonhittpcall,
0088   infonhittpcin,
0089   infonhittpcmid,
0090   infonhittpcout,
0091   infonclusall,
0092   infonclustpc,
0093   infonclustpcpos,
0094   infonclustpcneg,
0095   infonclusintt,
0096   infonclusmvtx,
0097   infonclustpot,
0098   infosize = infonclustpot + 1
0099 };
0100 
0101 enum n_vertex // NOLINT(readability-enum-initial-value, performance-enum-size)
0102 {
0103   vtxnvertexID,
0104   vtxnvx,
0105   vtxnvy,
0106   vtxnvz,
0107   vtxnntracks,
0108   vtxnchi2,
0109   vtxnndof,
0110   vtxsize = vtxnndof + 1
0111 };
0112 
0113 enum n_hit // NOLINT(readability-enum-initial-value, performance-enum-size)
0114 {
0115   nhitID,
0116   nhite,
0117   nhitadc,
0118   nhitlayer,
0119   nhitphielem,
0120   nhitzelem,
0121   nhitcellID,
0122   nhitecell,
0123   nhitphibin,
0124   nhittbin,
0125   nhitphi,
0126   nhitr,
0127   nhitx,
0128   nhity,
0129   nhitz,
0130   hitsize = nhitz + 1
0131 };
0132 
0133 enum n_seed // NOLINT(readability-enum-initial-value, performance-enum-size)
0134 {
0135   nseedtrackID,
0136   nseedniter,
0137   nseedpt,
0138   nseedptot,
0139   nseedeta,
0140   nseedphi,
0141   nseedsyxint,
0142   nseedsrzint,
0143   nseedsxyslope,
0144   nseedsrzslope,
0145   nseedX0,
0146   nseedY0,
0147   nseedZ0,
0148   nseedR0,
0149   nseedcharge,
0150   nseeddedx,
0151   nseedpidedx,
0152   nseedkdedx,
0153   nseedprdedx,
0154   nseedn1pix,
0155   nseednhits,
0156   seedsize = nseednhits + 1
0157 };
0158 
0159 enum n_residual // NOLINT(readability-enum-initial-value, performance-enum-size)
0160 {
0161   nresalpha,
0162   nresbeta,
0163   nresphio,
0164   nresphi,
0165   nresz,
0166   ressize = nresz + 1
0167 };
0168 
0169 enum n_track // NOLINT(readability-enum-initial-value, performance-enum-size)
0170 {
0171   ntrktrackID,
0172   ntrkcrossing,
0173   ntrkpx,
0174   ntrkpy,
0175   ntrkpz,
0176   ntrkpt,
0177   ntrketa,
0178   ntrkphi,
0179   ntrkdeltapt,
0180   ntrkdeltaeta,
0181   ntrkdeltaphi,
0182   ntrkcharge,
0183   ntrkquality,
0184   ntrkchisq,
0185   ntrkndf,
0186   ntrknhits,
0187   ntrknmaps,
0188   ntrknintt,
0189   ntrkntpc,
0190   ntrknmms,
0191   ntrkntpc1,
0192   ntrkntpc11,
0193   ntrkntpc2,
0194   ntrkntpc3,
0195   ntrkndedx,
0196   ntrknpidedx,
0197   ntrknkdedx,
0198   ntrknprdedx,
0199   ntrkvertexID,
0200   ntrkvx,
0201   ntrkvy,
0202   ntrkvz,
0203   ntrkdca2d,
0204   ntrkdca2dsigma,
0205   ntrkdca3dxy,
0206   ntrkdca3dxysigma,
0207   ntrkdca3dz,
0208   ntrkdca3dzsigma,
0209   ntrkpcax,
0210   ntrkpcay,
0211   ntrkpcaz,
0212   ntrkhlxpt,
0213   ntrkhlxeta,
0214   ntrkhlxphi,
0215   ntrkhlxX0,
0216   ntrkhlxY0,
0217   ntrkhlxZ0,
0218   ntrkhlxcharge,
0219   trksize = ntrkhlxcharge + 1
0220 };
0221 
0222 enum n_cluster // NOLINT(readability-enum-initial-value, performance-enum-size)
0223 {
0224   nclulocx,
0225   nclulocy,
0226   nclux,
0227   ncluy,
0228   ncluz,
0229   nclur,
0230   ncluphi,
0231   nclueta,
0232   nclutheta,
0233   ncluphibin,
0234   nclutbin,
0235   ncluex,
0236   ncluey,
0237   ncluez,
0238   ncluephi,
0239   nclupez,
0240   nclupephi,
0241   nclue,
0242   ncluadc,
0243   nclumaxadc,
0244   ncluthick,
0245   ncluafac,
0246   nclubfac,
0247   ncludcal,
0248   nclulayer,
0249   ncluphielem,
0250   ncluzelem,
0251   nclusize,
0252   ncluphisize,
0253   ncluzsize,
0254   nclupedge,
0255   ncluredge,
0256   ncluovlp,
0257   nclutrackID,
0258   ncluniter,
0259   clusize = ncluniter + 1
0260 };
0261 
0262 TrkrNtuplizer::TrkrNtuplizer(const std::string& /*name*/, const std::string& filename, const std::string& trackmapname,
0263                              unsigned int nlayers_maps,
0264                              unsigned int nlayers_intt,
0265                              unsigned int nlayers_tpc,
0266                              unsigned int nlayers_mms)
0267   : SubsysReco("TrkrNtuplizer")
0268   , _nlayers_maps(nlayers_maps)
0269   , _nlayers_intt(nlayers_intt)
0270   , _nlayers_tpc(nlayers_tpc)
0271   , _nlayers_mms(nlayers_mms)
0272   , _filename(filename)
0273   , _trackmapname(trackmapname)
0274 {
0275 }
0276 
0277 TrkrNtuplizer::~TrkrNtuplizer()
0278 {
0279   delete _timer;
0280 }
0281 
0282 int TrkrNtuplizer::Init(PHCompositeNode* /*unused*/)
0283 {
0284   _ievent = 0;
0285 
0286   _tfile = new TFile(_filename.c_str(), "RECREATE");
0287   _tfile->SetCompressionLevel(7);
0288   std::string str_vertex = {"vertexID:vx:vy:vz:ntracks:chi2:ndof"};
0289   std::string str_event = {"event:seed:run:seg:job"};
0290   std::string str_hit = {"hitID:e:adc:layer:phielem:zelem:cellID:ecell:phibin:tbin:phi:r:x:y:z"};
0291   std::string str_cluster = {"locx:locy:x:y:z:r:phi:eta:theta:phibin:tbin:ex:ey:ez:ephi:pez:pephi:e:adc:maxadc:thick:afac:bfac:dcal:layer:phielem:zelem:size:phisize:zsize:pedge:redge:ovlp:trackID:niter"};
0292   std::string str_seed = {"seedID:siter:spt:sptot:seta:sphi:syxint:srzint:sxyslope:srzslope:sX0:sY0:sdZ0:sR0:scharge:sdedx:spidedx:skdedx:sprdedx:sn1pix:snhits"};
0293   std::string str_residual = {"alpha:beta:resphio:resphi:resz"};
0294   std::string str_track = {"trackID:crossing:px:py:pz:pt:eta:phi:deltapt:deltaeta:deltaphi:charge:quality:chisq:ndf:nhits:nmaps:nintt:ntpc:nmms:ntpc1:ntpc11:ntpc2:ntpc3:dedx:pidedx:kdedx:prdedx:nlmaps:nlintt:nltpc:nlmms:layers:vertexID:vx:vy:vz:dca2d:dca2dsigma:dca3dxy:dca3dxysigma:dca3dz:dca3dzsigma:pcax:pcay:pcaz:hlxpt:hlxeta:hlxphi:hlxX0:hlxY0:hlxZ0:hlxcharge"};
0295   std::string str_info = {"occ11:occ116:occ21:occ216:occ31:occ316:ntrk:ntpcseed:nsiseed:nhitmvtx:nhitintt:nhittpot:nhittpcall:nhittpcin:nhittpcmid:nhittpcout:nclusall:nclustpc:nclustpcpos:nclustpcneg:nclusintt:nclusmaps:nclusmms"};
0296 
0297   if (_do_info_eval)
0298   {
0299     std::string ntp_varlist_info = str_event + ":" + str_info;
0300     _ntp_info = new TNtuple("ntp_info", "event info", ntp_varlist_info.c_str());
0301   }
0302 
0303   if (_do_vertex_eval)
0304   {
0305     std::string ntp_varlist_vtx = str_event + ":" + str_vertex + ":" + str_info;
0306     _ntp_vertex = new TNtuple("ntp_vertex", "vertex => max truth", ntp_varlist_vtx.c_str());
0307   }
0308 
0309   if (_do_hit_eval)
0310   {
0311     std::string ntp_varlist_ev = str_event + ":" + str_hit + ":" + str_info;
0312     _ntp_hit = new TNtuple("ntp_hit", "svtxhit => max truth", ntp_varlist_ev.c_str());
0313   }
0314 
0315   if (_do_cluster_eval)
0316   {
0317     std::string ntp_varlist_clu = str_event + ":" + str_cluster + ":" + str_info;
0318     _ntp_cluster = new TNtuple("ntp_cluster", "svtxcluster => max truth", ntp_varlist_clu.c_str());
0319   }
0320   if (_do_clus_trk_eval)
0321   {
0322     std::string ntp_varlist_clut = str_event + ":" + str_cluster + ":" + str_residual + ":" + str_seed + ":" + str_info;
0323     _ntp_clus_trk = new TNtuple("ntp_clus_trk", "cluster on track", ntp_varlist_clut.c_str());
0324   }
0325 
0326   if (_do_track_eval)
0327   {
0328     std::string ntp_varlist_trk = str_event + ":" + str_track + ":" + str_info;
0329     _ntp_track = new TNtuple("ntp_track", "svtxtrack => max truth", ntp_varlist_trk.c_str());
0330   }
0331 
0332   if (_do_tpcseed_eval)
0333   {
0334     std::string ntp_varlist_tsee = str_event + ":" + str_seed + ":" + str_info;
0335     _ntp_tpcseed = new TNtuple("ntp_tpcseed", "seeds from truth", ntp_varlist_tsee.c_str());
0336   }
0337   if (_do_siseed_eval)
0338   {
0339     std::string ntp_varlist_ssee = str_event + ":" + str_seed + ":" + str_info;
0340     _ntp_siseed = new TNtuple("ntp_siseed", "seeds from truth", ntp_varlist_ssee.c_str());
0341   }
0342 
0343   std::string dedx_fitparams = CDBInterface::instance()->getUrl("TPC_DEDX_FITPARAM");
0344   TFile *filefit = TFile::Open(dedx_fitparams.c_str());
0345 
0346   if (!filefit->IsOpen())
0347   {
0348       std::cout << "Error opening filefit!" << std::endl;
0349       return Fun4AllReturnCodes::ABORTEVENT;
0350   }
0351 
0352   filefit->GetObject("f_piband", f_pion_plus);
0353   filefit->GetObject("f_Kband", f_kaon_plus);
0354   filefit->GetObject("f_pband", f_proton_plus);
0355   filefit->GetObject("f_piminus_band", f_pion_minus);
0356   filefit->GetObject("f_Kminus_band", f_kaon_minus);
0357   filefit->GetObject("f_pbar_band", f_proton_minus);
0358   
0359   _timer = new PHTimer("_eval_timer");
0360   _timer->stop();
0361   /**/
0362 
0363   dedxcorr[0][0][0] = 0.54; 
0364   dedxcorr[0][0][1] = 0.90; 
0365   dedxcorr[0][0][2] = 1.11; 
0366   dedxcorr[0][1][0] = 0.72; 
0367   dedxcorr[0][1][1] = 0.98; 
0368   dedxcorr[0][1][2] = 0.99; 
0369   dedxcorr[0][2][0] = 0.83; 
0370   dedxcorr[0][2][1] = 0.81; 
0371   dedxcorr[0][2][2] = 1.03; 
0372   dedxcorr[0][3][0] = 0.82; 
0373   dedxcorr[0][3][1] = 0.52; 
0374   dedxcorr[0][3][2] = 1.02; 
0375   dedxcorr[0][4][0] = 0.85; 
0376   dedxcorr[0][4][1] = 0.78; 
0377   dedxcorr[0][4][2] = 0.82; 
0378   dedxcorr[0][5][0] = 0.85; 
0379   dedxcorr[0][5][1] = 0.70; 
0380   dedxcorr[0][5][2] = 0.92; 
0381   dedxcorr[0][6][0] = 0.78; 
0382   dedxcorr[0][6][1] = 0.94; 
0383   dedxcorr[0][6][2] = 1.03; 
0384   dedxcorr[0][7][0] = 0.64; 
0385   dedxcorr[0][7][1] = 0.94; 
0386   dedxcorr[0][7][2] = 1.19; 
0387   dedxcorr[0][8][0] = 0.95; 
0388   dedxcorr[0][8][1] = 0.47; 
0389   dedxcorr[0][8][2] = 1.12; 
0390   dedxcorr[0][9][0] = 0.74; 
0391   dedxcorr[0][9][1] = 1.07; 
0392   dedxcorr[0][9][2] = 0.85; 
0393   dedxcorr[0][10][0] = 0.86; 
0394   dedxcorr[0][10][1] = 0.74; 
0395   dedxcorr[0][10][2] = 1.08; 
0396   dedxcorr[0][11][0] = 0.60; 
0397   dedxcorr[0][11][1] = 1.03; 
0398   dedxcorr[0][11][2] = 0.89; 
0399   dedxcorr[1][0][0] = 0.74; 
0400   dedxcorr[1][0][1] = 0.76; 
0401   dedxcorr[1][0][2] = 0.89; 
0402   dedxcorr[1][1][0] = 0.61; 
0403   dedxcorr[1][1][1] = 0.87; 
0404   dedxcorr[1][1][2] = 1.10; 
0405   dedxcorr[1][2][0] = 0.73; 
0406   dedxcorr[1][2][1] = 0.86; 
0407   dedxcorr[1][2][2] = 1.70; 
0408   dedxcorr[1][3][0] = 0.40; 
0409   dedxcorr[1][3][1] = 0.76; 
0410   dedxcorr[1][3][2] = 0.99; 
0411   dedxcorr[1][4][0] = 0.82; 
0412   dedxcorr[1][4][1] = 0.71; 
0413   dedxcorr[1][4][2] = 0.86; 
0414   dedxcorr[1][5][0] = 0.65; 
0415   dedxcorr[1][5][1] = 1.00; 
0416   dedxcorr[1][5][2] = 0.79; 
0417   dedxcorr[1][6][0] = 0.75; 
0418   dedxcorr[1][6][1] = 0.84; 
0419   dedxcorr[1][6][2] = 0.40; 
0420   dedxcorr[1][7][0] = 0.95; 
0421   dedxcorr[1][7][1] = 0.81; 
0422   dedxcorr[1][7][2] = 0.85; 
0423   dedxcorr[1][8][0] = 0.79; 
0424   dedxcorr[1][8][1] = 0.67; 
0425   dedxcorr[1][8][2] = 1.17; 
0426   dedxcorr[1][9][0] = 0.73; 
0427   dedxcorr[1][9][1] = 0.94; 
0428   dedxcorr[1][9][2] = 0.95; 
0429   dedxcorr[1][10][0] = 0.40; 
0430   dedxcorr[1][10][1] = 0.83; 
0431   dedxcorr[1][10][2] = 0.87; 
0432   dedxcorr[1][11][0] = 0.80; 
0433   dedxcorr[1][11][1] = 0.63; 
0434   dedxcorr[1][11][2] = 0.68;
0435   dedxcorr[0][0][1] *= 0.88 ;
0436   dedxcorr[0][0][2] *= 0.92 ;
0437   dedxcorr[0][1][0] *= 0.90 ;
0438   dedxcorr[0][1][1] *= 0.92 ;
0439   dedxcorr[0][1][2] *= 0.94 ;
0440   dedxcorr[0][2][0] *= 0.80 ;
0441   dedxcorr[0][2][1] *= 0.81 ;
0442   dedxcorr[0][2][2] *= 0.88 ;
0443   dedxcorr[0][3][0] *= 0.76 ;
0444   dedxcorr[0][3][1] *= 0.76 ;
0445   dedxcorr[0][3][2] *= 0.77 ;
0446   dedxcorr[0][4][0] *= 0.87 ;
0447   dedxcorr[0][4][1] *= 0.88 ;
0448   dedxcorr[0][4][2] *= 0.85 ;
0449   dedxcorr[0][5][0] *= 0.86 ;
0450   dedxcorr[0][5][1] *= 0.87 ;
0451   dedxcorr[0][5][2] *= 0.92 ;
0452   dedxcorr[0][6][0] *= 0.89 ;
0453   dedxcorr[0][6][1] *= 0.91 ;
0454   dedxcorr[0][6][2] *= 0.91 ;
0455   dedxcorr[0][7][0] *= 0.90 ;
0456   dedxcorr[0][7][1] *= 0.90 ;
0457   dedxcorr[0][7][2] *= 0.94 ;
0458   dedxcorr[0][8][0] *= 0.87 ;
0459   dedxcorr[0][8][1] *= 0.90 ;
0460   dedxcorr[0][8][2] *= 0.91 ;
0461   dedxcorr[0][9][0] *= 0.92 ;
0462   dedxcorr[0][9][1] *= 0.92 ;
0463   dedxcorr[0][9][2] *= 0.94 ;
0464   dedxcorr[0][10][0] *= 0.91 ;
0465   dedxcorr[0][10][1] *= 0.92 ;
0466   dedxcorr[0][10][2] *= 0.93 ;
0467   dedxcorr[0][11][0] *= 0.87 ;
0468   dedxcorr[0][11][1] *= 0.88 ;
0469   dedxcorr[0][11][2] *= 0.91 ;
0470   dedxcorr[1][0][0] *= 0.91 ;
0471   dedxcorr[1][0][1] *= 0.92 ;
0472   dedxcorr[1][0][2] *= 0.92 ;
0473   dedxcorr[1][1][0] *= 0.92 ;
0474   dedxcorr[1][1][1] *= 0.89 ;
0475   dedxcorr[1][1][2] *= 0.91 ;
0476   dedxcorr[1][2][0] *= 0.84 ;
0477   dedxcorr[1][2][1] *= 0.87 ;
0478   dedxcorr[1][2][2] *= 1.05 ;
0479   dedxcorr[1][3][0] *= 0.83 ;
0480   dedxcorr[1][3][1] *= 0.89 ;
0481   dedxcorr[1][3][2] *= 0.90 ;
0482   dedxcorr[1][4][0] *= 0.90 ;
0483   dedxcorr[1][4][1] *= 0.91 ;
0484   dedxcorr[1][4][2] *= 0.91 ;
0485   dedxcorr[1][5][0] *= 0.92 ;
0486   dedxcorr[1][5][1] *= 0.93 ;
0487   dedxcorr[1][5][2] *= 0.93 ;
0488   dedxcorr[1][6][0] *= 0.87 ;
0489   dedxcorr[1][6][1] *= 0.85 ;
0490   dedxcorr[1][6][2] *= 0.99 ;
0491   dedxcorr[1][7][0] *= 0.92 ;
0492   dedxcorr[1][7][1] *= 0.89 ;
0493   dedxcorr[1][7][2] *= 0.89 ;
0494   dedxcorr[1][8][0] *= 0.88 ;
0495   dedxcorr[1][8][1] *= 0.89 ;
0496   dedxcorr[1][8][2] *= 0.95 ;
0497   dedxcorr[1][9][0] *= 0.89 ;
0498   dedxcorr[1][9][1] *= 0.90 ;
0499   dedxcorr[1][9][2] *= 0.91 ;
0500   dedxcorr[1][10][0] *= 0.86 ;
0501   dedxcorr[1][10][1] *= 0.92 ;
0502   dedxcorr[1][10][2] *= 0.95 ;
0503   dedxcorr[1][11][0] *= 0.85 ;
0504   dedxcorr[1][11][1] *= 0.85 ;
0505   dedxcorr[1][11][2] *= 0.88 ;
0506   
0507 
0508 
0509   return Fun4AllReturnCodes::EVENT_OK;
0510 }
0511 
0512 int TrkrNtuplizer::InitRun(PHCompositeNode* topNode)
0513 {
0514 
0515   auto *geom =
0516       findNode::getClass<PHG4TpcCylinderGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0517   if (!geom)
0518   {
0519     std::cout << PHWHERE << "ERROR: Can't find node CYLINDERCELLGEOM_SVTX" << std::endl;
0520     return Fun4AllReturnCodes::ABORTRUN;
0521   }
0522 AdcClockPeriod = geom->GetFirstLayerCellGeom()->get_zstep();
0523  return Fun4AllReturnCodes::EVENT_OK;
0524 }
0525 
0526 int TrkrNtuplizer::process_event(PHCompositeNode* topNode)
0527 {
0528   if ((Verbosity() > 1) && (_ievent % 100 == 0))
0529   {
0530     std::cout << "TrkrNtuplizer::process_event - Event = " << _ievent << std::endl;
0531   }
0532 
0533   recoConsts* rc = recoConsts::instance();
0534   if (rc->FlagExist("RANDOMSEED"))
0535   {
0536     _iseed = rc->get_IntFlag("RANDOMSEED");
0537     m_fSeed = _iseed;
0538   }
0539   else
0540   {
0541     _iseed = 0;
0542     m_fSeed = std::numeric_limits<float>::quiet_NaN();
0543   }
0544   if (_trackmap == nullptr)
0545   {
0546     _trackmap = findNode::getClass<SvtxTrackMap>(topNode, _trackmapname);
0547   }
0548 
0549   _cluster_map = findNode::getClass<TrkrClusterContainer>(topNode, "CORRECTED_TRKR_CLUSTER");
0550   if (!_cluster_map)
0551   {
0552     _cluster_map = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0553   }
0554 
0555   _tgeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
0556   if (!_tgeometry)
0557   {
0558     std::cout << "No Acts geometry on node tree. Can't  continue."
0559               << std::endl;
0560     return Fun4AllReturnCodes::ABORTEVENT;
0561   }
0562 
0563   _geom_container = findNode::getClass<PHG4TpcCylinderGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0564   {
0565     if (!_geom_container)
0566     {
0567       std::cout << PHWHERE << "ERROR: Can't find node CYLINDERCELLGEOM_SVTX" << std::endl;
0568       return Fun4AllReturnCodes::ABORTEVENT;
0569     }
0570   }
0571 
0572   if (Verbosity() > 1)
0573   {
0574     std::cout << "TrkrNtuplizer::process_event - Seed = " << _iseed << std::endl;
0575   }
0576   //-----------------------------------
0577   // print what is coming into the code
0578   //-----------------------------------
0579 
0580   printInputInfo(topNode);
0581 
0582   //---------------------------
0583   // fill the Evaluator NTuples
0584   //---------------------------
0585 
0586   fillOutputNtuples(topNode);
0587 
0588   //--------------------------------------------------
0589   // Print out the ancestry information for this event
0590   //--------------------------------------------------
0591 
0592   // printOutputInfo(topNode);
0593 
0594   ++_ievent;
0595   return Fun4AllReturnCodes::EVENT_OK;
0596 }
0597 
0598 int TrkrNtuplizer::End(PHCompositeNode* /*topNode*/)
0599 {
0600   _tfile->cd();
0601 
0602   if (_ntp_info)
0603   {
0604     _ntp_info->Write();
0605   }
0606   if (_ntp_vertex)
0607   {
0608     _ntp_vertex->Write();
0609   }
0610   if (_ntp_hit)
0611   {
0612     _ntp_hit->Write();
0613   }
0614   if (_ntp_cluster)
0615   {
0616     _ntp_cluster->Write();
0617   }
0618   if (_ntp_clus_trk)
0619   {
0620     _ntp_clus_trk->Write();
0621   }
0622   if (_ntp_track)
0623   {
0624     _ntp_track->Write();
0625   }
0626   if (_ntp_tpcseed)
0627   {
0628     _ntp_tpcseed->Write();
0629   }
0630   if (_ntp_siseed)
0631   {
0632     _ntp_siseed->Write();
0633   }
0634 
0635   _tfile->Close();
0636 
0637   delete _tfile;
0638 
0639   if (Verbosity() > 1)
0640   {
0641     std::cout << "========================= TrkrNtuplizer::End() ============================" << std::endl;
0642     std::cout << " " << _ievent << " events of output written to: " << _filename << std::endl;
0643     std::cout << "===========================================================================" << std::endl;
0644   }
0645 
0646   return Fun4AllReturnCodes::EVENT_OK;
0647 }
0648 
0649 void TrkrNtuplizer::printInputInfo(PHCompositeNode* topNode)
0650 {
0651   if (Verbosity() > 1)
0652   {
0653     std::cout << "TrkrNtuplizer::printInputInfo() entered" << std::endl;
0654   }
0655 
0656   if (Verbosity() > 3)
0657   {
0658     // event information
0659     std::cout << std::endl;
0660     std::cout << PHWHERE << "   INPUT FOR EVENT " << _ievent << std::endl;
0661 
0662     std::cout << std::endl;
0663 
0664     std::cout << "---SVTXCLUSTERS-------------" << std::endl;
0665 
0666     if (_cluster_map != nullptr)
0667     {
0668       unsigned int icluster = 0;
0669       for (const auto& hitsetkey : _cluster_map->getHitSetKeys())
0670       {
0671         auto range = _cluster_map->getClusters(hitsetkey);
0672         for (auto iter = range.first; iter != range.second; ++iter)
0673         {
0674           TrkrDefs::cluskey cluster_key = iter->first;
0675           std::cout << icluster << " with key " << cluster_key << " of " << _cluster_map->size();
0676           std::cout << ": SvtxCluster: " << std::endl;
0677           iter->second->identify();
0678           ++icluster;
0679         }
0680       }
0681     }
0682 
0683     std::cout << "---SVXTRACKS-------------" << std::endl;
0684 
0685     if (_trackmap)
0686     {
0687       unsigned int itrack = 0;
0688       for (auto& iter : *_trackmap)
0689       {
0690         std::cout << itrack << " of " << _trackmap->size();
0691         SvtxTrack* track = iter.second;
0692         std::cout << " : SvtxTrack:" << std::endl;
0693         track->identify();
0694         std::cout << std::endl;
0695         ++itrack;
0696       }
0697     }
0698 
0699     std::cout << "---SVXVERTEXES-------------" << std::endl;
0700     SvtxVertexMap* vertexmap = nullptr;
0701     vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
0702 
0703     if (vertexmap)
0704     {
0705       unsigned int ivertex = 0;
0706       for (SvtxVertexMap::Iter iter = vertexmap->begin();
0707            iter != vertexmap->end();
0708            ++iter)
0709       {
0710         std::cout << ivertex << " of " << vertexmap->size();
0711         SvtxVertex* vertex = iter->second;
0712         std::cout << " : SvtxVertex:" << std::endl;
0713         vertex->identify();
0714         std::cout << std::endl;
0715       }
0716     }
0717   }
0718 
0719   return;
0720 }
0721 
0722 void TrkrNtuplizer::printOutputInfo(PHCompositeNode* topNode)
0723 {
0724   if (Verbosity() > 1)
0725   {
0726     std::cout << "TrkrNtuplizer::printOutputInfo() entered" << std::endl;
0727   }
0728 
0729   //==========================================
0730   // print out some useful stuff for debugging
0731   //==========================================
0732 
0733   if (Verbosity() > 100)
0734   {
0735     // event information
0736     std::cout << std::endl;
0737     std::cout << PHWHERE << "   NEW OUTPUT FOR EVENT " << _ievent << std::endl;
0738     std::cout << std::endl;
0739 
0740     float vx = std::numeric_limits<float>::quiet_NaN();
0741     float vy = std::numeric_limits<float>::quiet_NaN();
0742     float vz = std::numeric_limits<float>::quiet_NaN();
0743 
0744     SvtxVertexMap* vertexmap = nullptr;
0745 
0746     vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
0747 
0748     if (vertexmap)
0749     {
0750       if (!vertexmap->empty())
0751       {
0752         SvtxVertex* vertex = (vertexmap->begin()->second);
0753 
0754         vx = vertex->get_x();
0755         vy = vertex->get_y();
0756         vz = vertex->get_z();
0757       }
0758     }
0759 
0760     std::cout << "===Vertex Reconstruction=======================" << std::endl;
0761     std::cout << "vreco = (" << vx << "," << vy << "," << vz << ")" << std::endl;
0762     std::cout << std::endl;
0763 
0764     std::cout << "===Tracking Summary============================" << std::endl;
0765 
0766     TrkrHitSetContainer* hitsetmap = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
0767 
0768     unsigned int nclusters[100] = {0};
0769     unsigned int nhits[100] = {0};
0770 
0771     _tgeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
0772 
0773     if (!_tgeometry)
0774     {
0775       std::cout << PHWHERE << "No Acts geometry on node tree. Can't  continue."
0776                 << std::endl;
0777     }
0778 
0779     if (hitsetmap)
0780     {
0781       TrkrHitSetContainer::ConstRange all_hitsets = hitsetmap->getHitSets();
0782       for (TrkrHitSetContainer::ConstIterator hitsetiter = all_hitsets.first;
0783            hitsetiter != all_hitsets.second;
0784            ++hitsetiter)
0785       {
0786         // we have a single hitset, get the layer
0787         unsigned int layer = TrkrDefs::getLayer(hitsetiter->first);
0788 
0789         // count all hits in this hitset
0790         TrkrHitSet::ConstRange hitrangei = hitsetiter->second->getHits();
0791         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
0792              hitr != hitrangei.second;
0793              ++hitr)
0794         {
0795           ++nhits[layer];
0796         }
0797         auto range = _cluster_map->getClusters(hitsetiter->first);
0798         for (auto clusIter = range.first; clusIter != range.second; ++clusIter)
0799         {
0800           const auto cluskey = clusIter->first;
0801           nclusters[TrkrDefs::getLayer(cluskey)]++;
0802         }
0803       }
0804     }
0805 
0806     for (unsigned int ilayer = 0; ilayer < _nlayers_maps + _nlayers_intt + _nlayers_tpc; ++ilayer)
0807     {
0808       PHG4TpcCylinderGeom* GeoLayer = _geom_container->GetLayerCellGeom(ilayer);
0809 
0810       std::cout << "layer " << ilayer
0811            << " => nHits = " << nhits[ilayer]
0812            << " => nClusters = " << nclusters[ilayer] << std::endl;
0813       if (ilayer >= _nlayers_maps + _nlayers_intt && ilayer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0814       {
0815         std::cout << "layer " << ilayer
0816              << " => nphi = " << GeoLayer->get_phibins()
0817              << " => nz   = " << GeoLayer->get_zbins()
0818              << " => ntot = " << GeoLayer->get_phibins() * GeoLayer->get_zbins()
0819              << std::endl;
0820       }
0821     }
0822 
0823     std::cout << " => nTracks = ";
0824     if (_trackmap)
0825     {
0826       std::cout << _trackmap->size() << std::endl;
0827     }
0828     else
0829     {
0830       std::cout << 0 << std::endl;
0831     }
0832 
0833     std::cout << std::endl;
0834 
0835   }  // if Verbosity()
0836 
0837   return;
0838 }
0839 
0840 void TrkrNtuplizer::fillOutputNtuples(PHCompositeNode* topNode)
0841 {
0842   if (Verbosity() > 1)
0843   {
0844     std::cout << "TrkrNtuplizer::fillOutputNtuples() entered" << std::endl;
0845   }
0846 
0847   float fx_event[n_event::evsize]{(float) _ievent, (float) _iseed, (float) m_runnumber,(float) m_segment, (float) m_job};
0848   float fx_info[((int) (n_info::infosize))] = {0};
0849 
0850   float nhit[100];
0851   for (float& i : nhit)
0852   {
0853     i = 0;
0854   }
0855 
0856   if (_ntp_info){
0857     TrkrHitSetContainer* hitmap_in = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
0858     if (hitmap_in)
0859       {
0860     TrkrHitSetContainer::ConstRange all_hitsets = hitmap_in->getHitSets();
0861     for (TrkrHitSetContainer::ConstIterator hitsetiter = all_hitsets.first;
0862          hitsetiter != all_hitsets.second;
0863          ++hitsetiter)
0864       {
0865         // we have a single hitset, get the layer
0866         unsigned int layer = TrkrDefs::getLayer(hitsetiter->first);
0867         
0868         TrkrHitSet::ConstRange hitrangei = hitsetiter->second->getHits();
0869         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
0870          hitr != hitrangei.second;
0871          ++hitr)
0872           {
0873         nhit[layer]++;
0874         
0875         if (layer < _nlayers_maps)
0876           {
0877             fx_info[n_info::infonhitmvtx]++;
0878           }
0879         if (layer >= _nlayers_maps && layer < _nlayers_maps + _nlayers_intt)
0880           {
0881             fx_info[n_info::infonhitintt]++;
0882           }
0883         if ((float) layer >= _nlayers_maps + _nlayers_intt &&
0884             (float) layer < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0885           {
0886             fx_info[n_info::infonhittpcall]++;
0887           }
0888         if ((float) layer >= _nlayers_maps + _nlayers_intt + _nlayers_tpc)
0889           {
0890             fx_info[n_info::infonhittpot]++;
0891           }
0892         if ((float) layer == _nlayers_maps + _nlayers_intt)
0893           {
0894             fx_info[n_info::infonhittpcin]++;
0895           }
0896         if ((float) layer == _nlayers_maps + _nlayers_intt + _nlayers_tpc - 1)
0897           {
0898             fx_info[n_info::infonhittpcout]++;
0899           }
0900         // NOLINTNEXTLINE(bugprone-integer-division)
0901         if ((float) layer == _nlayers_maps + _nlayers_intt + _nlayers_tpc / 2 - 1)
0902           {
0903             fx_info[n_info::infonhittpcmid]++;
0904           }
0905           }
0906       }
0907       }
0908     
0909     _geom_container = findNode::getClass<PHG4TpcCylinderGeomContainer>(topNode, "CYLINDERCELLGEOM_SVTX");
0910     if (!_geom_container)
0911       {
0912     std::cout << PHWHERE << "ERROR: Can't find node CYLINDERCELLGEOM_SVTX" << std::endl;
0913     return;
0914       }
0915     PHG4TpcCylinderGeom* GeoLayer;
0916     int layer = _nlayers_maps + _nlayers_intt;
0917     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0918     int nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0919     float nhits = nhit[layer];
0920     fx_info[n_info::infonocc11] = nhits / nbins;
0921     
0922     layer = _nlayers_maps + _nlayers_intt + 15;
0923     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0924     nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0925     nhits = nhit[layer];
0926     fx_info[n_info::infonocc116] = nhits / nbins;
0927     
0928     layer = _nlayers_maps + _nlayers_intt + 16;
0929     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0930     nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0931     nhits = nhit[layer];
0932     fx_info[n_info::infonocc21] = nhits / nbins;
0933     layer = _nlayers_maps + _nlayers_intt + 31;
0934     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0935     nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0936     nhits = nhit[layer];
0937     fx_info[n_info::infonocc216] = nhits / nbins;
0938     layer = _nlayers_maps + _nlayers_intt + 32;
0939     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0940     nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0941     nhits = nhit[layer];
0942     fx_info[n_info::infonocc31] = nhits / nbins;
0943     layer = _nlayers_maps + _nlayers_intt + 47;
0944     GeoLayer = _geom_container->GetLayerCellGeom(layer);
0945     nbins = GeoLayer->get_phibins() * GeoLayer->get_zbins();
0946     nhits = nhit[layer];
0947     fx_info[n_info::infonocc316] = nhits / nbins;
0948     
0949     if (Verbosity() > 1)
0950       {
0951     std::cout << " occ11 = " << fx_info[n_info::infonocc11]
0952          << " occ116 = " << fx_info[n_info::infonocc116]
0953          << " occ21 = " << fx_info[n_info::infonocc21]
0954          << " occ216 = " << fx_info[n_info::infonocc216]
0955          << " occ31 = " << fx_info[n_info::infonocc31]
0956          << " occ316 = " << fx_info[n_info::infonocc316]
0957          << std::endl;
0958       }
0959     
0960     if (_cluster_map)
0961       {
0962     fx_info[n_info::infonclusall] = _cluster_map->size();
0963     
0964     for (const auto& hitsetkey : _cluster_map->getHitSetKeys())
0965       {
0966         auto range = _cluster_map->getClusters(hitsetkey);
0967         for (auto iter_cin = range.first; iter_cin != range.second; ++iter_cin)
0968           {
0969         TrkrDefs::cluskey cluster_key = iter_cin->first;
0970         unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
0971         unsigned int side_local = TpcDefs::getSide(cluster_key);
0972         if (_nlayers_maps > 0)
0973           {
0974             if (layer_local < _nlayers_maps)
0975               {
0976             fx_info[n_info::infonclusmvtx]++;
0977               }
0978           }
0979         if (_nlayers_intt > 0)
0980           {
0981             if ((layer_local >= _nlayers_maps) && (layer_local < (_nlayers_maps + _nlayers_intt)))
0982               {
0983             fx_info[n_info::infonclusintt]++;
0984               }
0985           }
0986         if (_nlayers_tpc > 0)
0987           {
0988             if (layer_local >= (_nlayers_maps + _nlayers_intt) && layer_local < (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
0989               {
0990             fx_info[n_info::infonclustpc]++;
0991             if(side_local==0){
0992               fx_info[n_info::infonclustpcneg]++;
0993             }
0994             if(side_local==1){
0995               fx_info[n_info::infonclustpcpos]++;
0996             }
0997               }
0998           }
0999         if (_nlayers_mms > 0)
1000           {
1001             if (layer_local >= (_nlayers_maps + _nlayers_intt + _nlayers_tpc))
1002               {
1003             fx_info[n_info::infonclustpot]++;
1004               }
1005           }
1006           }
1007       }
1008       }
1009   }
1010   //-----------------------
1011   // fill the info NTuple
1012   //-----------------------
1013   if (_ntp_info)
1014   {
1015     if (Verbosity() > 1)
1016     {
1017       std::cout << "Filling ntp_info " << std::endl;
1018     }
1019 
1020     if (_trackmap)
1021     {
1022       fx_info[n_info::infontrk] = (float) _trackmap->size();
1023     }
1024     auto *siseedmap = findNode::getClass<TrackSeedContainer>(topNode, "SiliconTrackSeedContainer");
1025     auto *tpcseedmap = findNode::getClass<TrackSeedContainer>(topNode, "TpcTrackSeedContainer");
1026     if (tpcseedmap){
1027       fx_info[n_info::infonntpcseed] = tpcseedmap->size();
1028     }else{
1029       fx_info[n_info::infonntpcseed] = 0;
1030     }
1031     if (siseedmap){
1032       fx_info[n_info::infonnsiseed] = siseedmap->size();
1033     }else{
1034       fx_info[n_info::infonnsiseed] = 0;
1035     }
1036     if (Verbosity() > 0)
1037     {
1038       std::cout << "EVENTINFO SEED: " << m_fSeed << std::endl;
1039       std::cout << "EVENTINFO NHIT: " << std::setprecision(9) << fx_info[n_info::infonclusall] << std::endl;
1040       std::cout << "EVENTINFO CLUSTPC: " << fx_info[n_info::infonclustpc] << std::endl;
1041       std::cout << "EVENTINFO NTRKREC: " << fx_info[n_info::infontrk] << std::endl;
1042     }
1043 
1044     float* info_data = new float[((int) (n_info::infosize)) + n_event::evsize];
1045     std::copy(fx_event, fx_event + n_event::evsize, info_data);
1046     std::copy(fx_info, fx_info + ((int) (n_info::infosize)), info_data + n_event::evsize);
1047     _ntp_info->Fill(info_data);
1048     delete[] info_data;
1049   }
1050 
1051   //-----------------------
1052   // fill the Vertex NTuple
1053   //-----------------------
1054   bool doit = true;
1055   if (_ntp_vertex && doit)
1056   {
1057     if (Verbosity() > 1)
1058     {
1059       std::cout << "Filling ntp_vertex " << std::endl;
1060       std::cout << "start vertex time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1061       _timer->restart();
1062     }
1063     float fx_vertex[n_vertex::vtxsize];
1064     for (float& i : fx_vertex)
1065     {
1066       i = 0;
1067     }
1068 
1069     //    SvtxVertexMap* vertexmap = nullptr;
1070 
1071     //    vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMapActs");  // Acts vertices
1072 
1073     float vx = std::numeric_limits<float>::quiet_NaN();
1074     float vy = std::numeric_limits<float>::quiet_NaN();
1075     float vz = std::numeric_limits<float>::quiet_NaN();
1076     float ntracks = std::numeric_limits<float>::quiet_NaN();
1077     fx_vertex[vtxnvx] = vx;
1078     fx_vertex[vtxnvy] = vy;
1079     fx_vertex[vtxnvz] = vz;
1080     fx_vertex[vtxnntracks] = ntracks;
1081     if (Verbosity() > 1)
1082     {
1083       std::cout << " adding vertex data " << std::endl;
1084     }
1085     float* vertex_data = new float[((int) (n_info::infosize)) + n_event::evsize + n_vertex::vtxsize];
1086     std::copy(fx_event, fx_event + n_event::evsize, vertex_data);
1087     std::copy(fx_vertex, fx_vertex + n_vertex::vtxsize, vertex_data + n_event::evsize);
1088     std::copy(fx_info, fx_info + ((int) (n_info::infosize)), vertex_data + n_event::evsize + n_vertex::vtxsize);
1089     _ntp_vertex->Fill(vertex_data);
1090     delete[] vertex_data;
1091   }
1092   if (Verbosity() > 1)
1093   {
1094     _timer->stop();
1095     std::cout << "vertex time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1096   }
1097   //--------------------
1098   // fill the Hit NTuple
1099   //--------------------
1100 
1101   if (_ntp_hit)
1102   {
1103     float* hit_data = new float[((int) (n_info::infosize)) + n_event::evsize + n_hit::hitsize];
1104     float fx_hit_0[((int) (n_info::infosize)) + n_event::evsize +n_hit::hitsize] = {0};
1105     float fx_hit[((int) (n_hit::hitsize))] = {0};
1106     auto *m_tGeometry = findNode::getClass<ActsGeometry>(topNode, "ActsGeometry");
1107 
1108     if (Verbosity() >= 1)
1109     {
1110       std::cout << "Filling ntp_hit " << std::endl;
1111       _timer->restart();
1112     }
1113     // need things off of the DST...
1114     TrkrHitSetContainer* hitmap = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
1115 
1116     if (hitmap)
1117     {
1118       TrkrHitSetContainer::ConstRange all_hitsets = hitmap->getHitSets();
1119       for (TrkrHitSetContainer::ConstIterator iter = all_hitsets.first;
1120            iter != all_hitsets.second;
1121            ++iter)
1122       {
1123         TrkrDefs::hitsetkey hitset_key = iter->first;
1124         TrkrHitSet* hitset = iter->second;
1125 
1126         // get all hits for this hitset
1127         TrkrHitSet::ConstRange hitrangei = hitset->getHits();
1128         for (TrkrHitSet::ConstIterator hitr = hitrangei.first;
1129              hitr != hitrangei.second;
1130              ++hitr)
1131         {
1132           TrkrDefs::hitkey hit_key = hitr->first;
1133           TrkrHit* hit = hitr->second;
1134 
1135           fx_hit[n_hit::nhitID] = hit_key;
1136           fx_hit[n_hit::nhite] = hit->getEnergy();
1137           fx_hit[n_hit::nhitadc] = hit->getAdc();
1138           unsigned int layer_local = TrkrDefs::getLayer(hitset_key);
1139           fx_hit[n_hit::nhitlayer] = (float) layer_local;
1140           fx_hit[n_hit::nhitphielem] = -666;
1141           fx_hit[n_hit::nhitzelem] = -666;
1142 
1143           if (layer_local >= 3 && layer_local < 7)
1144           {
1145             fx_hit[n_hit::nhitphielem] = InttDefs::getLadderPhiId(hitset_key);
1146             fx_hit[n_hit::nhitzelem] = InttDefs::getLadderZId(hitset_key);
1147           }
1148           if (layer_local >= 7 && layer_local < 55)
1149           {
1150             fx_hit[n_hit::nhitphielem] = TpcDefs::getSectorId(hitset_key);
1151             fx_hit[n_hit::nhitzelem] = TpcDefs::getSide(hitset_key);
1152           }
1153           /*
1154           if(layer_local>=55){
1155             if(MicromegasDefs::getSegmentationType(hitset_key)==MicromegasDefs::SEGMENTATION_Z){
1156               sector = 1;
1157               side = MicromegasDefs::getStrip(hit_key);
1158             }else{
1159               sector =MicromegasDefs::getStrip(hit_key);
1160               side =  1;
1161             }
1162           }
1163           */
1164           fx_hit[n_hit::nhitphielem] = TpcDefs::getSectorId(hitset_key);
1165           fx_hit[n_hit::nhitzelem] = TpcDefs::getSide(hitset_key);
1166           fx_hit[n_hit::nhitcellID] = 0;
1167           fx_hit[n_hit::nhitecell] = hit->getAdc();
1168           fx_hit[n_hit::nhitphibin] = std::numeric_limits<float>::quiet_NaN();
1169           fx_hit[n_hit::nhittbin] = std::numeric_limits<float>::quiet_NaN();
1170           fx_hit[n_hit::nhitphi] = std::numeric_limits<float>::quiet_NaN();
1171           fx_hit[n_hit::nhitr] = std::numeric_limits<float>::quiet_NaN();
1172           fx_hit[n_hit::nhitx] = std::numeric_limits<float>::quiet_NaN();
1173           fx_hit[n_hit::nhity] = std::numeric_limits<float>::quiet_NaN();
1174           fx_hit[n_hit::nhitz] = std::numeric_limits<float>::quiet_NaN();
1175 
1176           if (layer_local >= _nlayers_maps + _nlayers_intt && layer_local < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
1177           {
1178             PHG4TpcCylinderGeom* GeoLayer_local = _geom_container->GetLayerCellGeom(layer_local);
1179             double radius = GeoLayer_local->get_radius();
1180             fx_hit[n_hit::nhitphibin] = (float) TpcDefs::getPad(hit_key);
1181             fx_hit[n_hit::nhittbin] = (float) TpcDefs::getTBin(hit_key);
1182             fx_hit[n_hit::nhitphi] = GeoLayer_local->get_phicenter(fx_hit[n_hit::nhitphibin], fx_hit[n_hit::nhitzelem]);
1183             float phi = GeoLayer_local->get_phicenter(TpcDefs::getPad(hit_key), fx_hit[n_hit::nhitzelem]);
1184             float clockperiod = GeoLayer_local->get_zstep();
1185             auto glob = m_tGeometry->getGlobalPositionTpc(hitset_key, hit_key, phi, radius, clockperiod);
1186             
1187             fx_hit[n_hit::nhitz] = glob.z();
1188             fx_hit[n_hit::nhitr] = radius;
1189             fx_hit[n_hit::nhitx] = glob.x();
1190             fx_hit[n_hit::nhity] = glob.y();
1191           }
1192 
1193           std::copy(fx_event, fx_event + n_event::evsize, hit_data);
1194           std::copy(fx_hit, fx_hit + n_hit::hitsize, hit_data + n_event::evsize);
1195           std::copy(fx_info, fx_info + ((int) (n_info::infosize)), hit_data + n_event::evsize + n_hit::hitsize);
1196           _ntp_hit->Fill(hit_data);
1197       // erase hit data
1198       std::copy(fx_hit_0, fx_hit_0 + ((int) (n_info::infosize)) + n_event::evsize + n_hit::hitsize, hit_data);
1199         }
1200       }
1201       delete[] hit_data;
1202     }
1203     if (Verbosity() >= 1)
1204     {
1205       _timer->stop();
1206       std::cout << "hit time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1207     }
1208   }
1209 
1210   //------------------------
1211   // fill the Cluster NTuple
1212   //------------------------
1213 
1214   if (Verbosity() >= 1)
1215   {
1216     std::cout << "check for ntp_cluster" << std::endl;
1217     _timer->restart();
1218   }
1219 
1220   if (_ntp_cluster)
1221   {
1222     if (Verbosity() > 1)
1223     {
1224       std::cout << "Filling ntp_cluster (all of them) " << std::endl;
1225     }
1226 
1227     TrkrHitSetContainer* hitsets = findNode::getClass<TrkrHitSetContainer>(topNode, "TRKR_HITSET");
1228     //    TrkrClusterIterationMapv1* _iteration_map = findNode::getClass<TrkrClusterIterationMapv1>(topNode, "CLUSTER_ITERATION_MAP");
1229     ClusterErrorPara ClusErrPara;
1230 
1231     if (Verbosity() > 1)
1232     {
1233       if (_cluster_map != nullptr)
1234       {
1235         std::cout << "got clustermap" << std::endl;
1236       }
1237       else
1238       {
1239         std::cout << "no clustermap" << std::endl;
1240       }
1241 
1242       if (hitsets != nullptr)
1243       {
1244         std::cout << "got hitsets" << std::endl;
1245       }
1246       else
1247       {
1248         std::cout << "no hitsets" << std::endl;
1249       }
1250     }
1251 
1252     if (_cluster_map && hitsets){
1253       float* cluster_data = new float[((int) (n_info::infosize)) + n_event::evsize + n_cluster::clusize];
1254       Float_t fx_cluster_0[((int) (n_info::infosize)) + n_event::evsize + n_cluster::clusize] = {0};
1255       for (const auto& hitsetkey : _cluster_map->getHitSetKeys())
1256       {
1257         auto range = _cluster_map->getClusters(hitsetkey);
1258         for (auto iter = range.first; iter != range.second; ++iter)
1259         {
1260           TrkrDefs::cluskey cluster_key = iter->first;
1261           Float_t fx_cluster[n_cluster::clusize];
1262           FillCluster(&fx_cluster[0], cluster_key);
1263 
1264           std::copy(fx_event, fx_event + n_event::evsize, cluster_data);
1265           std::copy(fx_cluster, fx_cluster + n_cluster::clusize, cluster_data + n_event::evsize);
1266           std::copy(fx_info, fx_info + ((int) (n_info::infosize)), cluster_data + n_event::evsize + n_cluster::clusize);
1267           _ntp_cluster->Fill(cluster_data);
1268       std::copy(fx_cluster_0, fx_cluster_0 + ((int) (n_info::infosize)) + n_event::evsize + n_cluster::clusize, cluster_data);
1269         }
1270       }
1271       delete[] cluster_data;
1272     }
1273   }
1274 
1275   if (Verbosity() >= 1)
1276   {
1277     _timer->stop();
1278     std::cout << "cluster time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1279   }
1280   if (_ntp_clus_trk)
1281   {
1282     
1283     
1284     if (Verbosity() > 1)
1285     {
1286       std::cout << "Filling ntp_clus_trk " << std::endl;
1287       if (_cluster_map != nullptr)
1288       {
1289         std::cout << "got clustermap" << std::endl;
1290       }
1291       else
1292       {
1293         std::cout << "no clustermap" << std::endl;
1294       }
1295     }
1296 
1297     TrackSeedContainer* _tpc_seeds = findNode::getClass<TrackSeedContainer>(topNode, "TpcTrackSeedContainer");
1298     if (!_tpc_seeds)
1299     {
1300       std::cout << PHWHERE << " ERROR: Can't find "
1301            << "TpcTrackSeedContainer" << std::endl;
1302       return;
1303     }
1304 
1305     if (_trackmap)
1306     {
1307       int trackID = 0;
1308       float* clus_trk_data = new float[((int) (n_info::infosize)) + n_cluster::clusize + n_residual::ressize + n_seed::seedsize + n_event::evsize];
1309       float fx_clus_trk_0[((int) (n_info::infosize)) + n_cluster::clusize + n_residual::ressize + n_seed::seedsize + n_event::evsize] = {0};
1310       for (auto& iter : *_trackmap)
1311       {
1312     trackID++;
1313         SvtxTrack* track = iter.second;
1314         TrackSeed* tpcseed = track->get_tpc_seed();
1315         TrackSeed* siseed = track->get_silicon_seed();
1316         std::vector<Acts::Vector3> clusterPositions;
1317         std::vector<TrkrDefs::cluskey> clusterKeys;
1318 
1319         TrackFitUtils::position_vector_t xypoints;
1320         TrackFitUtils::position_vector_t rzpoints;
1321 
1322         clusterKeys.insert(clusterKeys.end(), tpcseed->begin_cluster_keys(),
1323                            tpcseed->end_cluster_keys());
1324 
1325         TrackFitUtils::getTrackletClusters(_tgeometry, _cluster_map,
1326                                            clusterPositions, clusterKeys);
1327         for (auto& pos : clusterPositions)
1328         {
1329           float clusr = sqrt((pos.x() * pos.x()) + (pos.y() * pos.y()));
1330           if (pos.y() < 0)
1331           {
1332             clusr *= -1;
1333           }
1334 
1335           // exclude silicon and tpot clusters for now
1336           if (std::fabs(clusr) > 80 || std::fabs(clusr) < 30)
1337           {
1338             continue;
1339           }
1340           rzpoints.emplace_back(pos.z(), clusr);
1341           xypoints.emplace_back(pos.x(), pos.y());
1342         }
1343 
1344         std::vector<float> fitparams = TrackFitUtils::fitClusters(clusterPositions, clusterKeys);
1345         if (fitparams.empty())
1346         {
1347           std::cout << "fit failed bailing...." << std::endl;
1348           continue;
1349         }
1350 
1351         float charge = std::numeric_limits<float>::quiet_NaN();
1352         if (tpcseed->get_qOverR() > 0)
1353         {
1354           charge = 1;
1355         }
1356         else
1357         {
1358           charge = -1;
1359         }
1360 
1361         //        "pt:eta:phi:X0:Y0:charge:nhits:"
1362         float tpt = tpcseed->get_pt();
1363     float tptot = tpcseed->get_p();
1364         float teta = tpcseed->get_eta();
1365         float tphi = tpcseed->get_phi();
1366     auto xyparams = TrackFitUtils::line_fit(xypoints);
1367         auto rzparams = TrackFitUtils::line_fit(rzpoints);
1368         float xyint = std::get<1>(xyparams);
1369         float xyslope = std::get<0>(xyparams);
1370         float rzint = std::get<1>(rzparams);
1371         float rzslope = std::get<0>(rzparams);
1372         float R0 = abs(-1 * xyint) / std::sqrt((xyslope * xyslope) + 1);
1373         float tX0 = tpcseed->get_X0();
1374         float tY0 = tpcseed->get_Y0();
1375         float tZ0 = tpcseed->get_Z0();
1376 
1377         float nhits_local = clusterPositions.size();
1378         if (Verbosity() > 1)
1379         {
1380           std::cout << " tpc: " << tpcseed->size_cluster_keys() << std::endl;
1381           if (siseed)
1382           {
1383             std::cout << " si " << siseed->size_cluster_keys() << std::endl;
1384           }
1385           std::cout << "done seedsize" << std::endl;
1386         }
1387         //      nhits_local += tpcseed->size_cluster_keys();
1388         // fill the Gseed NTuple
1389         //---------------------
1390     float dedx = calc_dedx(tpcseed);
1391     float pidedx = 0;
1392     float kdedx = 0;
1393     float prdedx = 0;
1394     if(charge>0){
1395       pidedx = f_pion_plus->Eval(tptot);
1396       kdedx = f_kaon_plus->Eval(tptot);
1397       prdedx = f_proton_plus->Eval(tptot);
1398     }else{
1399       pidedx = f_pion_minus->Eval(tptot);
1400       kdedx = f_kaon_minus->Eval(tptot);
1401       prdedx = f_proton_plus->Eval(tptot);
1402     }
1403     float n1pix = get_n1pix(tpcseed);
1404         float fx_seed[n_seed::seedsize] = {(float) trackID, 0, tpt, tptot, teta, tphi, xyint, rzint, xyslope, rzslope, tX0, tY0, tZ0, R0, charge, dedx, pidedx, kdedx, prdedx, n1pix, nhits_local};
1405 
1406         if (_ntp_tpcseed)
1407         {
1408           float* tpcseed_data = new float[((int) (n_info::infosize)) + n_cluster::clusize + n_residual::ressize + n_seed::seedsize + n_event::evsize];
1409           std::copy(fx_event, fx_event + n_event::evsize, tpcseed_data);
1410           std::copy(fx_seed, fx_seed + n_seed::seedsize, tpcseed_data + n_event::evsize);
1411           std::copy(fx_info, fx_info + ((int) (n_info::infosize)), tpcseed_data + n_event::evsize + n_seed::seedsize);
1412           _ntp_tpcseed->Fill(tpcseed_data);
1413       delete[] tpcseed_data;
1414         }
1415         for (unsigned int i = 0; i < clusterPositions.size(); i++)
1416         {
1417           TrkrDefs::cluskey cluster_key = clusterKeys.at(i);
1418       unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
1419       Acts::Vector3 position = clusterPositions[i];
1420           Acts::Vector3 pca = TrackFitUtils::get_helix_pca(fitparams, position);
1421 
1422           float cluster_phi = atan2(position(1), position(0));
1423           float pca_phi = atan2(pca(1), pca(0));
1424           float dphi = cluster_phi - pca_phi;
1425       if (dphi > M_PI)
1426           {
1427             dphi = 2 * M_PI - dphi;
1428           }
1429           if (dphi < -M_PI)
1430           {
1431             dphi = 2 * M_PI + dphi;
1432           }
1433 
1434           float dz = position(2) - pca(2);
1435 
1436       float resr = sqrt((position(0)*position(0))+(position(1)*position(1))+(position(2)*position(2)));
1437       float seedR = std::abs(1.0 / tpcseed->get_qOverR());
1438       float alpha = (resr * resr) / (2 * resr * seedR);
1439       float beta = std::abs(std::atan(tpcseed->get_slope()));
1440           float fx_cluster[n_cluster::clusize];
1441 
1442       if(layer_local>=7&&layer_local<55){
1443         PHG4TpcCylinderGeom* GeoLayer_local = _geom_container->GetLayerCellGeom(layer_local);
1444         float thick = GeoLayer_local->get_thickness();
1445         
1446         float alphacorr = std::cos(alpha);
1447         if(alphacorr<0||alphacorr>4){
1448           alphacorr=4;
1449         }
1450         float betacorr = std::cos(beta);
1451         if(betacorr<0||betacorr>4){
1452           betacorr=4;
1453         }
1454         fx_cluster[ncluthick] = thick;
1455         fx_cluster[ncluafac] = alphacorr;
1456         fx_cluster[nclubfac] =betacorr;
1457       }
1458       else{
1459         fx_cluster[ncluthick] = 0;
1460         fx_cluster[ncluafac] = 0;
1461         fx_cluster[nclubfac] = 0;
1462       }
1463       float fx_res[n_residual::ressize] = {alpha,beta,dphi,dphi,dz};
1464           // sphi:syxint:srzint:sxyslope:srzslope:sX0:sY0:sdZ0:sR0
1465           FillCluster(&fx_cluster[0], cluster_key);
1466           std::copy(fx_event, fx_event + n_event::evsize, clus_trk_data);
1467           std::copy(fx_cluster, fx_cluster + n_cluster::clusize, clus_trk_data + n_event::evsize);
1468           std::copy(fx_res, fx_res + n_residual::ressize, clus_trk_data + n_event::evsize + n_cluster::clusize);
1469           std::copy(fx_seed, fx_seed + n_seed::seedsize, clus_trk_data + n_event::evsize + n_cluster::clusize + n_residual::ressize);
1470           std::copy(fx_info, fx_info + ((int) (n_info::infosize)), clus_trk_data + n_event::evsize + n_cluster::clusize + n_residual::ressize + n_seed::seedsize);
1471           _ntp_clus_trk->Fill(clus_trk_data);
1472       std::copy(fx_clus_trk_0, fx_clus_trk_0 + ((int) (n_info::infosize)) + n_cluster::clusize + n_residual::ressize + n_seed::seedsize + n_event::evsize,clus_trk_data);
1473 
1474         }
1475       }
1476       delete[] clus_trk_data;
1477     }
1478   }
1479 
1480   //------------------------
1481   // fill the Track NTuple
1482   //------------------------
1483 
1484   if (_ntp_track)
1485   {
1486     if (Verbosity() >= 1)
1487     {
1488       std::cout << "Filling ntp_track " << std::endl;
1489       _timer->restart();
1490     }
1491     GlobalVertexMap* vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
1492     if (_trackmap)
1493     {
1494       for (auto& iter : *_trackmap)
1495       {
1496         SvtxTrack* track = iter.second;
1497         float fx_track[n_track::trksize];
1498         FillTrack(&fx_track[0], track, vertexmap);
1499         float* track_data = new float[((int) (n_info::infosize)) + n_track::trksize + n_event::evsize];
1500         std::copy(fx_event, fx_event + n_event::evsize, track_data);
1501         std::copy(fx_track, fx_track + n_track::trksize, track_data + n_event::evsize);
1502         std::copy(fx_info, fx_info + ((int) (n_info::infosize)), track_data + n_event::evsize + n_track::trksize);
1503         _ntp_track->Fill(track_data);
1504     delete[] track_data;
1505       }
1506     }
1507     if (Verbosity() > 1)
1508     {
1509       _timer->stop();
1510       std::cout << "track time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1511     }
1512   }
1513 
1514   if (_ntp_siseed)
1515   {
1516     if (Verbosity() > 1)
1517     {
1518       std::cout << "Filling ntp_tpcseed " << std::endl;
1519       _timer->restart();
1520     }
1521 
1522     if (Verbosity() > 1)
1523     {
1524       _timer->stop();
1525       std::cout << "tpcseed time:                " << _timer->get_accumulated_time() / 1000. << " sec" << std::endl;
1526     }
1527   }
1528   return;
1529 }
1530 
1531 void TrkrNtuplizer::FillTrack(float fX[50], SvtxTrack* track, GlobalVertexMap* vertexmap)
1532 {
1533   float trackID = track->get_id();
1534   TrackSeed* tpcseed = track->get_tpc_seed();
1535   TrackSeed* silseed = track->get_silicon_seed();
1536   short int crossing_int = track->get_crossing();
1537   fX[n_track::ntrktrackID] = trackID;
1538   fX[n_track::ntrkcrossing] = std::numeric_limits<float>::quiet_NaN();
1539   if (crossing_int == SHRT_MAX)
1540   {
1541     fX[n_track::ntrkcrossing] = std::numeric_limits<float>::quiet_NaN();
1542   }
1543   else
1544   {
1545     fX[n_track::ntrkcrossing] = (float) crossing_int;
1546   }
1547   fX[n_track::ntrkcharge] = track->get_charge();
1548   fX[n_track::ntrkquality] = track->get_quality();
1549   fX[n_track::ntrkchisq] = track->get_chisq();
1550   fX[n_track::ntrkndf] = track->get_ndf();
1551   fX[n_track::ntrknhits] = 0;
1552   if (tpcseed)
1553   {
1554     fX[n_track::ntrknhits] += tpcseed->size_cluster_keys();
1555   }
1556   if (silseed)
1557   {
1558     fX[n_track::ntrknhits] += silseed->size_cluster_keys();
1559   }
1560 
1561   fX[n_track::ntrknmaps] = 0;
1562   fX[n_track::ntrknintt] = 0;
1563   fX[n_track::ntrknmms] = 0;
1564   fX[n_track::ntrkntpc] = 0;
1565   fX[n_track::ntrkntpc1] = 0;
1566   fX[n_track::ntrkntpc11] = 0;
1567   fX[n_track::ntrkntpc2] = 0;
1568   fX[n_track::ntrkntpc3] = 0;
1569   fX[n_track::ntrkndedx] = 0;
1570   fX[n_track::ntrknpidedx] = 0;
1571   fX[n_track::ntrknkdedx] = 0;
1572   fX[n_track::ntrknprdedx] = 0;
1573   if (tpcseed)
1574   {
1575     fX[n_track::ntrkndedx] = calc_dedx(tpcseed);
1576     float trptot = track->get_p(); 
1577     if(track->get_charge()>0){
1578       fX[n_track::ntrknpidedx] = f_pion_plus->Eval(trptot);
1579       fX[n_track::ntrknkdedx] = f_kaon_plus->Eval(trptot);
1580       fX[n_track::ntrknprdedx] = f_proton_plus->Eval(trptot);
1581     }else{
1582       fX[n_track::ntrknpidedx] = f_pion_minus->Eval(trptot);
1583       fX[n_track::ntrknkdedx] = f_kaon_minus->Eval(trptot);
1584       fX[n_track::ntrknprdedx] = f_proton_minus->Eval(trptot);
1585     }
1586     
1587     for (SvtxTrack::ConstClusterKeyIter iter_local = tpcseed->begin_cluster_keys();
1588          iter_local != tpcseed->end_cluster_keys();
1589          ++iter_local)
1590     {
1591       TrkrDefs::cluskey cluster_key = *iter_local;
1592       unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
1593       switch (TrkrDefs::getTrkrId(cluster_key))
1594       {
1595       case TrkrDefs::TrkrId::mvtxId:
1596         fX[n_track::ntrknmaps]++;
1597         break;
1598       case TrkrDefs::TrkrId::inttId:
1599         fX[n_track::ntrknintt]++;
1600         break;
1601       case TrkrDefs::TrkrId::tpcId:
1602         fX[n_track::ntrkntpc]++;
1603         if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 8)
1604         {
1605           fX[n_track::ntrkntpc11]++;
1606         }
1607         if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 16)
1608         {
1609           fX[n_track::ntrkntpc1]++;
1610         }
1611         else if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 32)
1612         {
1613           fX[n_track::ntrkntpc2]++;
1614         }
1615         else if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 48)
1616         {
1617           fX[n_track::ntrkntpc3]++;
1618         }
1619         break;
1620       case TrkrDefs::TrkrId::micromegasId:
1621         fX[n_track::ntrknmms]++;
1622         break;
1623       default:
1624         break;
1625       }
1626     }
1627   }
1628   if (silseed)
1629   {
1630     for (SvtxTrack::ConstClusterKeyIter iter_local = silseed->begin_cluster_keys();
1631          iter_local != silseed->end_cluster_keys();
1632          ++iter_local)
1633     {
1634       TrkrDefs::cluskey cluster_key = *iter_local;
1635       unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
1636       switch (TrkrDefs::getTrkrId(cluster_key))
1637       {
1638       case TrkrDefs::TrkrId::mvtxId:
1639         fX[n_track::ntrknmaps]++;
1640         break;
1641       case TrkrDefs::TrkrId::inttId:
1642         fX[n_track::ntrknintt]++;
1643         break;
1644       case TrkrDefs::TrkrId::tpcId:
1645         fX[n_track::ntrkntpc]++;
1646         if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 8)
1647         {
1648           fX[n_track::ntrkntpc11]++;
1649         }
1650         if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 16)
1651         {
1652           fX[n_track::ntrkntpc1]++;
1653         }
1654         else if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 32)
1655         {
1656           fX[n_track::ntrkntpc2]++;
1657         }
1658         else if ((layer_local - (_nlayers_maps + _nlayers_intt)) < 48)
1659         {
1660           fX[n_track::ntrkntpc3]++;
1661         }
1662         break;
1663       case TrkrDefs::TrkrId::micromegasId:
1664         fX[n_track::ntrknmms]++;
1665         break;
1666       default:
1667         break;
1668       }
1669     }
1670   }
1671   fX[n_track::ntrkdca3dxy] = std::numeric_limits<float>::quiet_NaN();
1672   fX[n_track::ntrkdca3dz] = std::numeric_limits<float>::quiet_NaN();
1673   fX[n_track::ntrkdca3dxysigma] = std::numeric_limits<float>::quiet_NaN();
1674   fX[n_track::ntrkdca3dzsigma] = std::numeric_limits<float>::quiet_NaN();
1675   fX[n_track::ntrkdca2d] = std::numeric_limits<float>::quiet_NaN();
1676   fX[n_track::ntrkdca2dsigma] = std::numeric_limits<float>::quiet_NaN();
1677   fX[n_track::ntrkvx] = std::numeric_limits<float>::quiet_NaN();
1678   fX[n_track::ntrkvy] = std::numeric_limits<float>::quiet_NaN();
1679   fX[n_track::ntrkvz] = std::numeric_limits<float>::quiet_NaN();
1680 
1681   int vertexID = track->get_vertex_id();
1682   fX[n_track::ntrkvertexID] = vertexID;
1683   
1684   if (vertexID >= 0&& vertexmap !=nullptr)
1685   {
1686     if(vertexmap->size()>100000){
1687       std::cout << "too many vtx's" << std::endl;
1688     }
1689     /*
1690     auto vertexit = vertexmap->find(vertexID);
1691     if (vertexit != vertexmap->end())
1692       {
1693         auto vertex = vertexit->second;
1694 
1695     float vx = vertex->get_x();
1696     float vy = vertex->get_y();
1697     float vz = vertex->get_z();
1698     fX[n_track::ntrkvx] = vx;
1699     fX[n_track::ntrkvy] = vy;
1700     fX[n_track::ntrkvz] = vz;
1701     Acts::Vector3 vert(vx, vy, vz);
1702     Acts::Vector3 zero = Acts::Vector3::Zero();
1703     auto dcapair = TrackAnalysisUtils::get_dca(track, zero);
1704     fX[n_track::ntrkdca3dxy] = dcapair.first.first;
1705     fX[n_track::ntrkdca3dxysigma] = dcapair.first.second;
1706     fX[n_track::ntrkdca3dz] = dcapair.second.first;
1707     fX[n_track::ntrkdca3dzsigma] = dcapair.second.second;
1708     
1709       }
1710     */
1711 
1712   }
1713   
1714   fX[n_track::ntrkcharge] = track->get_charge();
1715   float px = track->get_px();
1716   float py = track->get_py();
1717   float pz = track->get_pz();
1718   fX[n_track::ntrkpx] = px;
1719   fX[n_track::ntrkpy] = py;
1720   fX[n_track::ntrkpz] = pz;
1721   TVector3 v(px, py, pz);
1722   fX[n_track::ntrkpt] = v.Pt();
1723   fX[n_track::ntrketa] = v.Eta();
1724   fX[n_track::ntrkphi] = v.Phi();
1725   float CVxx = track->get_error(3, 3);
1726   float CVxy = track->get_error(3, 4);
1727   float CVxz = track->get_error(3, 5);
1728   float CVyy = track->get_error(4, 4);
1729   float CVyz = track->get_error(4, 5);
1730   float CVzz = track->get_error(5, 5);
1731   fX[n_track::ntrkdeltapt] = std::sqrt((CVxx * px * px + 2 * CVxy * px * py + CVyy * py * py) / (px * px + py * py));
1732   fX[n_track::ntrkdeltaeta] = 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)));
1733   fX[n_track::ntrkdeltaphi] = std::sqrt((CVyy * px * px - 2 * CVxy * px * py + CVxx * py * py) / ((px * px + py * py) * (px * px + py * py)));
1734 
1735   fX[n_track::ntrkpcax] = track->get_x();
1736   fX[n_track::ntrkpcay] = track->get_y();
1737   fX[n_track::ntrkpcaz] = track->get_z();
1738 }
1739 
1740 float TrkrNtuplizer::calc_dedx(TrackSeed *tpcseed){
1741 
1742     std::vector<TrkrDefs::cluskey> clusterKeys;
1743     clusterKeys.insert(clusterKeys.end(), tpcseed->begin_cluster_keys(),
1744                tpcseed->end_cluster_keys());
1745 
1746     std::vector<float> dedxlist;
1747     for (unsigned long cluster_key : clusterKeys){
1748       unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
1749       if(TrkrDefs::getTrkrId(cluster_key) != TrkrDefs::TrkrId::tpcId){
1750       continue;
1751       }
1752       TrkrCluster* cluster = _cluster_map->findCluster(cluster_key);
1753       int cside = TpcDefs::getSide(cluster_key);
1754       int csector = TpcDefs::getSectorId(cluster_key);
1755       int csegment = 0;
1756       if(layer_local >= 7+32){
1757     csegment = 2;
1758       }else if(layer_local >=7+16){
1759     csegment = 1;
1760       }
1761       float adc = cluster->getAdc();
1762       if(_do_dedx_calib==true){
1763     if(dedxcorr[cside][csector][csegment]!=0){
1764       adc/=dedxcorr[cside][csector][csegment];
1765     }
1766       }
1767       PHG4TpcCylinderGeom* GeoLayer_local = _geom_container->GetLayerCellGeom(layer_local);
1768       float thick = GeoLayer_local->get_thickness();
1769       
1770       float r = GeoLayer_local->get_radius();
1771       float alpha = (r * r) / (2 * r * std::abs(1.0 / tpcseed->get_qOverR()));
1772       float beta = std::atan(tpcseed->get_slope());
1773       float alphacorr = std::cos(alpha);
1774       if(alphacorr<0||alphacorr>4){
1775     alphacorr=4;
1776       }
1777       float betacorr = std::cos(beta);
1778       if(betacorr<0||betacorr>4){
1779     betacorr=4;
1780       }
1781       adc/=thick;
1782       adc*=alphacorr;
1783       adc*=betacorr;
1784       dedxlist.push_back(adc);
1785       sort(dedxlist.begin(), dedxlist.end());
1786     }
1787     int trunc_min = 0;
1788     int trunc_max = (int)dedxlist.size()*0.7;
1789     float sumdedx = 0;
1790     int ndedx = 0;
1791     for(int j = trunc_min; j<=trunc_max;j++){
1792       sumdedx+=dedxlist.at(j);
1793       ndedx++;
1794     }
1795     sumdedx/=ndedx;
1796     return sumdedx;
1797 }
1798 
1799 float TrkrNtuplizer::get_n1pix(TrackSeed *tpcseed){
1800 
1801     std::vector<TrkrDefs::cluskey> clusterKeys;
1802     clusterKeys.insert(clusterKeys.end(), tpcseed->begin_cluster_keys(),
1803                tpcseed->end_cluster_keys());
1804 
1805     float n1pix = 0;
1806     for (unsigned long cluster_key : clusterKeys){
1807       TrkrCluster* cluster = _cluster_map->findCluster(cluster_key);
1808       if(cluster->getPhiSize()==1){
1809     n1pix++;
1810       }
1811     }
1812     return n1pix;
1813 }
1814 
1815 void TrkrNtuplizer::FillCluster(float fXcluster[n_cluster::clusize], TrkrDefs::cluskey cluster_key)
1816 {
1817   unsigned int layer_local = TrkrDefs::getLayer(cluster_key);
1818   TrkrCluster* cluster = _cluster_map->findCluster(cluster_key);
1819 
1820   Acts::Vector3 cglob;
1821   cglob = _tgeometry->getGlobalPosition(cluster_key, cluster);
1822   float x = cglob(0);
1823   float y = cglob(1);
1824   float z = cglob(2);
1825   TVector3 pos(x, y, z);
1826   float r = pos.Perp();
1827   float phi = pos.Phi();
1828   auto para_errors = _ClusErrPara.get_clusterv5_modified_error(cluster, r, cluster_key);
1829   float phibin = std::numeric_limits<float>::quiet_NaN();
1830   float tbin = std::numeric_limits<float>::quiet_NaN();
1831   float locx = cluster->getLocalX();
1832   float locy = cluster->getLocalY();
1833   fXcluster[n_cluster::ncludcal] = 1;
1834   if (layer_local >= _nlayers_maps + _nlayers_intt && layer_local < _nlayers_maps + _nlayers_intt + _nlayers_tpc)
1835   {
1836     int side_tpc = TpcDefs::getSide(cluster_key);
1837     PHG4TpcCylinderGeom* GeoLayer_local = _geom_container->GetLayerCellGeom(layer_local);
1838     phibin = GeoLayer_local->get_pad_float(phi, side_tpc);
1839     tbin = GeoLayer_local->get_tbin_float(locy - 39.6);
1840     int cside = TpcDefs::getSide(cluster_key);
1841     int csector = TpcDefs::getSectorId(cluster_key);
1842     int csegment = 0;
1843     if(layer_local >= 7+32){
1844       csegment = 2;
1845     }else if(layer_local >=7+16){
1846       csegment = 1;
1847     }
1848     if(_do_dedx_calib==true){
1849       fXcluster[n_cluster::ncludcal] = dedxcorr[cside][csector][csegment];
1850     }else{
1851       fXcluster[n_cluster::ncludcal] = 1;
1852     }
1853   }
1854   else
1855   {
1856     phibin = locx;
1857     tbin = locy;
1858   }
1859   fXcluster[n_cluster::nclulocx] = locx;
1860   fXcluster[n_cluster::nclulocy] = locy;
1861   fXcluster[n_cluster::nclux] = cglob(0);
1862   fXcluster[n_cluster::ncluy] = cglob(1);
1863   fXcluster[n_cluster::ncluz] = cglob(2);
1864   fXcluster[n_cluster::nclur] = pos.Perp();
1865   fXcluster[n_cluster::ncluphi] = pos.Phi();
1866   fXcluster[n_cluster::nclueta] = pos.Eta();
1867   fXcluster[n_cluster::nclutheta] = pos.Theta();
1868 
1869   fXcluster[n_cluster::ncluphibin] = phibin;
1870   fXcluster[n_cluster::nclutbin] = tbin;
1871 
1872   fXcluster[n_cluster::ncluex] = std::numeric_limits<float>::quiet_NaN();
1873   fXcluster[n_cluster::ncluey] = std::numeric_limits<float>::quiet_NaN();
1874   fXcluster[n_cluster::ncluez] = sqrt(para_errors.second);
1875   fXcluster[n_cluster::ncluephi] = sqrt(para_errors.first);
1876   fXcluster[n_cluster::nclupez] = std::numeric_limits<float>::quiet_NaN();
1877   fXcluster[n_cluster::nclupephi] = std::numeric_limits<float>::quiet_NaN();
1878   fXcluster[n_cluster::nclue] = cluster->getAdc();
1879   fXcluster[n_cluster::ncluadc] = cluster->getAdc();
1880   fXcluster[n_cluster::nclumaxadc] = cluster->getMaxAdc();
1881   fXcluster[n_cluster::nclulayer] = layer_local;
1882 
1883   if (layer_local < 3)
1884   {
1885     fXcluster[n_cluster::ncluphielem] = MvtxDefs::getStaveId(cluster_key);
1886     fXcluster[n_cluster::ncluzelem] = MvtxDefs::getChipId(cluster_key);
1887   }
1888   if (layer_local >= 3 && layer_local < 7)
1889   {
1890     fXcluster[n_cluster::ncluphielem] = InttDefs::getLadderPhiId(cluster_key);
1891     fXcluster[n_cluster::ncluzelem] = InttDefs::getLadderZId(cluster_key);
1892   }
1893   if (layer_local >= 7 && layer_local < 55)
1894   {
1895     fXcluster[n_cluster::ncluphielem] = TpcDefs::getSectorId(cluster_key);
1896     fXcluster[n_cluster::ncluzelem] = TpcDefs::getSide(cluster_key);
1897   } /*
1898       if(layer_local>=55){
1899       if(MicromegasDefs::getSegmentationType(hitsetkey)==MicromegasDefs::SEGMENTATION_Z){
1900       sector = 1;
1901       side = MicromegasDefs::getTileId(hitsetkey);
1902       }else{
1903       sector =MicromegasDefs::getTileId(hitsetkey);
1904       side =  1;
1905       }
1906       }
1907     */
1908   fXcluster[n_cluster::nclusize] = cluster->getSize();
1909   fXcluster[n_cluster::ncluphisize] = cluster->getPhiSize();
1910   fXcluster[n_cluster::ncluzsize] = cluster->getZSize();
1911   fXcluster[n_cluster::nclupedge] = cluster->getEdge();
1912   if (layer_local == 7 || layer_local == 22 ||
1913       layer_local == 23 || layer_local == 28 ||
1914       layer_local == 39 || layer_local == 54)
1915   {
1916     fXcluster[n_cluster::ncluredge] = 1;
1917   }
1918 
1919   fXcluster[n_cluster::ncluovlp] = 3;  // cluster->getOvlp();
1920   fXcluster[n_cluster::nclutrackID] = std::numeric_limits<float>::quiet_NaN();
1921   fXcluster[n_cluster::ncluniter] = 0;
1922 
1923   return;
1924 }
1925 
1926 std::vector<TrkrDefs::cluskey> TrkrNtuplizer::get_track_ckeys(SvtxTrack* track)
1927 {
1928   std::vector<TrkrDefs::cluskey> cluster_keys;
1929   TrackSeed* tpcseed = track->get_tpc_seed();
1930   TrackSeed* silseed = track->get_silicon_seed();
1931   if (silseed)
1932   {
1933     for (auto iter = silseed->begin_cluster_keys();
1934          iter != silseed->end_cluster_keys();
1935          ++iter)
1936     {
1937       cluster_keys.push_back(*iter);
1938     }
1939   }
1940   if (tpcseed)
1941   {
1942     for (auto iter = tpcseed->begin_cluster_keys();
1943          iter != tpcseed->end_cluster_keys();
1944          ++iter)
1945     {
1946       cluster_keys.push_back(*iter);
1947     }
1948   }
1949 
1950   return cluster_keys;
1951 }
1952 
1953 SvtxTrack* TrkrNtuplizer::best_track_from(TrkrDefs::cluskey cluster_key)
1954 {
1955   std::map<TrkrDefs::cluskey, SvtxTrack*>::iterator find_iter =
1956       _cache_best_track_from_cluster.find(cluster_key);
1957   if (find_iter != _cache_best_track_from_cluster.end())
1958   {
1959     return find_iter->second;
1960   }
1961 
1962   SvtxTrack* best_track = nullptr;
1963   float best_quality = FLT_MAX;
1964 
1965   std::set<SvtxTrack*> tracks = all_tracks_from(cluster_key);
1966   // loop over all SvtxTracks
1967   for (auto *candidate : tracks)
1968   {
1969     if (candidate->get_quality() < best_quality)
1970     {
1971       best_quality = candidate->get_quality();
1972       best_track = candidate;
1973     }
1974   }
1975 
1976   _cache_best_track_from_cluster.insert(std::make_pair(cluster_key, best_track));
1977   return best_track;
1978 }
1979 
1980 std::set<SvtxTrack*> TrkrNtuplizer::all_tracks_from(TrkrDefs::cluskey cluster_key)
1981 {
1982   std::set<SvtxTrack*> tracks;
1983 
1984   if (_cache_track_from_cluster_exists == false)
1985   {
1986     create_cache_track_from_cluster();
1987   }
1988   std::map<TrkrDefs::cluskey, std::set<SvtxTrack*> >::iterator find_iter =
1989       _cache_all_tracks_from_cluster.find(cluster_key);
1990   if (find_iter != _cache_all_tracks_from_cluster.end())
1991   {
1992     return find_iter->second;
1993   }
1994   
1995       return tracks;
1996  
1997 
1998   // loop over all SvtxTracks
1999   for (auto& iter : *_trackmap)
2000   {
2001     SvtxTrack* track = iter.second;
2002     std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
2003 
2004     // loop over all clusters
2005     for (const auto& candidate : cluster_keys)
2006     {
2007       //      if (_strict)
2008       //      {
2009       //        assert(candidate);
2010       //      }
2011       //      else if (!candidate)
2012       //      {
2013       //        ++_errors;
2014       //        continue;
2015       //      }
2016 
2017       if (cluster_key == candidate)
2018       {
2019         tracks.insert(track);
2020       }
2021     }
2022   }
2023 
2024   _cache_all_tracks_from_cluster.insert(std::make_pair(cluster_key, tracks));
2025 
2026   return tracks;
2027 }
2028 
2029 void TrkrNtuplizer::create_cache_track_from_cluster()
2030 {
2031   if (!_trackmap)
2032   {
2033     return;
2034   }
2035 
2036   // loop over all SvtxTracks
2037   for (auto& iter : *_trackmap)
2038   {
2039     SvtxTrack* track = iter.second;
2040     std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
2041 
2042     // loop over all clusters
2043     for (const auto& candidate_key : cluster_keys)
2044     {
2045       // check if cluster has an entry in cache
2046       std::map<TrkrDefs::cluskey, std::set<SvtxTrack*> >::iterator cliter =
2047           _cache_all_tracks_from_cluster.find(candidate_key);
2048       if (cliter != _cache_all_tracks_from_cluster.end())
2049       {                                // got entry
2050         cliter->second.insert(track);  // add track to list;
2051       }
2052       else
2053       {
2054         std::set<SvtxTrack*> tracks;
2055         tracks.insert(track);
2056         _cache_all_tracks_from_cluster.insert(std::make_pair(candidate_key, tracks));
2057       }
2058     }
2059   }
2060   _cache_track_from_cluster_exists = true;
2061 
2062   return;
2063 }
2064 
2065 TMatrixF TrkrNtuplizer::calculateClusterError(TrkrCluster* c, float& clusphi)
2066 {
2067   TMatrixF localErr(3, 3);
2068   localErr[0][0] = 0.;
2069   localErr[0][1] = 0.;
2070   localErr[0][2] = 0.;
2071   localErr[1][0] = 0.;
2072   localErr[1][1] = c->getActsLocalError(0, 0);
2073   localErr[1][2] = c->getActsLocalError(0, 1);
2074   localErr[2][0] = 0.;
2075   localErr[2][1] = c->getActsLocalError(1, 0);
2076   localErr[2][2] = c->getActsLocalError(1, 1);
2077 
2078   TMatrixF ROT(3, 3);
2079   ROT[0][0] = std::cos(clusphi);
2080   ROT[0][1] = -std::sin(clusphi);
2081   ROT[0][2] = 0.0;
2082   ROT[1][0] = std::sin(clusphi);
2083   ROT[1][1] = std::cos(clusphi);
2084   ROT[1][2] = 0.0;
2085   ROT[2][0] = 0.0;
2086   ROT[2][1] = 0.0;
2087   ROT[2][2] = 1.0;
2088   TMatrixF ROT_T(3, 3);
2089   ROT_T.Transpose(ROT);
2090 
2091   TMatrixF err(3, 3);
2092   err = ROT * localErr * ROT_T;
2093   return err;
2094 }