Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:14:50

0001 #include <g4eval/SvtxEvalStack.h>
0002 
0003 #include <phool/PHCompositeNode.h>
0004 #include <fun4all/Fun4AllReturnCodes.h>
0005 #include <phool/getClass.h>
0006 
0007 #include <g4hough/SvtxVertexMap.h>
0008 #include <g4hough/SvtxVertex.h>
0009 #include <g4hough/SvtxTrackMap.h>
0010 #include <g4hough/SvtxTrack.h>
0011 #include <g4hough/SvtxClusterMap.h>
0012 #include <g4hough/SvtxCluster.h>
0013 #include <g4hough/SvtxHitMap.h>
0014 #include <g4hough/SvtxHit.h>
0015 
0016 #include <g4main/PHG4Hit.h>
0017 #include <g4main/PHG4Particle.h>
0018 #include <g4main/PHG4VtxPoint.h>
0019 #include <g4main/PHG4TruthInfoContainer.h>
0020 
0021 #include <g4detectors/PHG4Cell.h>
0022 
0023 #include <TFile.h>
0024 #include <TNtuple.h>
0025 
0026 #include <iostream>
0027 #include <set>
0028 #include <cmath>
0029 #include <cassert>
0030 
0031 #include "../../psTOF/psTOFTimezeroEval/psTOFTimezeroEval.h"
0032 
0033 using namespace std;
0034 
0035 psTOFTimezeroEval::psTOFTimezeroEval(const string &name, const string &filename) :
0036   SubsysReco("psTOFTimezeroEval"),
0037   _ievent(0),
0038   _svtxevalstack(nullptr),
0039   _strict(false),
0040   _errors(0),
0041   _do_vertex_eval(true),
0042   _do_gpoint_eval(true),
0043   _do_g4hit_eval(true),
0044   _do_hit_eval(true),
0045   _do_cluster_eval(true),
0046   _do_gtrack_eval(true),
0047   _do_track_eval(true),
0048   _scan_for_embedded(false),
0049   _ntp_vertex(nullptr),
0050   _ntp_gpoint(nullptr),
0051   _ntp_g4hit(nullptr),
0052   _ntp_hit(nullptr),
0053   _ntp_cluster(nullptr),
0054   _ntp_gtrack(nullptr),
0055   _ntp_track(nullptr),
0056   _filename(filename),
0057   _tfile(nullptr) {
0058   verbosity = 0;
0059 }
0060 
0061 int psTOFTimezeroEval::Init(PHCompositeNode *topNode) {
0062   
0063   _ievent = 0;
0064 
0065   _tfile = new TFile(_filename.c_str(), "RECREATE");
0066 
0067   if (_do_vertex_eval) _ntp_vertex = new TNtuple("ntp_vertex","vertex => max truth",
0068                          "event:vx:vy:vz:ntracks:"
0069                          "gvx:gvy:gvz:gvt:gntracks:"
0070                          "nfromtruth");
0071 
0072   if (_do_gpoint_eval) _ntp_gpoint = new TNtuple("ntp_gpoint","g4point => best vertex",
0073                          "event:gvx:gvy:gvz:gvt:gntracks:"
0074                          "vx:vy:vz:ntracks:"
0075                          "nfromtruth");
0076   
0077   if (_do_g4hit_eval) _ntp_g4hit = new TNtuple("ntp_g4hit","g4hit => best svtxcluster",
0078                            "event:g4hitID:gx:gy:gz:gt:gedep:"
0079                            "glayer:gtrackID:gflavor:"
0080                            "gpx:gpy:gpz:gvx:gvy:gvz:"
0081                            "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0082                            "gembed:gprimary:nclusters:"
0083                            "clusID:x:y:z:e:adc:layer:size:"
0084                            "phisize:zsize:efromtruth");
0085 
0086   if (_do_hit_eval) _ntp_hit = new TNtuple("ntp_hit","svtxhit => max truth",
0087                        "event:hitID:e:adc:layer:"
0088                        "cellID:ecell:"
0089                        "g4hitID:gedep:gx:gy:gz:gt:"
0090                        "gtrackID:gflavor:"
0091                        "gpx:gpy:gpz:gvx:gvy:gvz:"
0092                        "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0093                        "gembed:gprimary:efromtruth");
0094 
0095   if (_do_cluster_eval) _ntp_cluster = new TNtuple("ntp_cluster","svtxcluster => max truth",
0096                            "event:hitID:x:y:z:ex:ey:ez:ephi:"
0097                            "e:adc:layer:size:phisize:"
0098                            "zsize:trackID:g4hitID:gx:"
0099                            "gy:gz:gt:gtrackID:gflavor:"
0100                            "gpx:gpy:gpz:gvx:gvy:gvz:"
0101                            "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0102                            "gembed:gprimary:efromtruth");
0103 
0104   if (_do_gtrack_eval) _ntp_gtrack  = new TNtuple("ntp_gtrack","g4particle => best svtxtrack",
0105                           "event:gtrackID:gflavor:gnhits:"
0106                           "gpx:gpy:gpz:"
0107                           "gvx:gvy:gvz:gvt:"
0108                           "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0109                           "gembed:gprimary:"
0110                           "trackID:px:py:pz:charge:quality:chisq:ndf:nhits:layers:"
0111                           "dca2d:dca2dsigma:pcax:pcay:pcaz:nfromtruth:layersfromtruth:"
0112                           "nmaps:nintt:ntpc");
0113   
0114   if (_do_track_eval) _ntp_track = new TNtuple("ntp_track","svtxtrack => max truth",
0115                            "event:trackID:px:py:pz:charge:"
0116                            "quality:chisq:ndf:nhits:layers:"
0117                            "dca2d:dca2dsigma:pcax:pcay:pcaz:"
0118                            "presdphi:presdeta:prese3x3:prese:"   
0119                            "cemcdphi:cemcdeta:cemce3x3:cemce:"
0120                            "hcalindphi:hcalindeta:hcaline3x3:hcaline:"
0121                            "hcaloutdphi:hcaloutdeta:hcaloute3x3:hcaloute:"
0122                            "gtrackID:gflavor:gnhits:"
0123                            "gpx:gpy:gpz:"
0124                            "gvx:gvy:gvz:gvt:"
0125                            "gfpx:gfpy:gfpz:gfx:gfy:gfz:"
0126                            "gembed:gprimary:nfromtruth:layersfromtruth:"
0127                            "nmaps:nintt:ntpc");
0128   
0129   return Fun4AllReturnCodes::EVENT_OK;
0130 }
0131 
0132 int psTOFTimezeroEval::InitRun(PHCompositeNode *topNode) {
0133   return Fun4AllReturnCodes::EVENT_OK;
0134 }
0135   
0136 int psTOFTimezeroEval::process_event(PHCompositeNode *topNode) {
0137   
0138   if ((verbosity > 0)&&(_ievent%100==0)) {
0139     cout << "psTOFTimezeroEval::process_event - Event = " << _ievent << endl;
0140   }
0141 
0142   if (!_svtxevalstack) {
0143     _svtxevalstack = new SvtxEvalStack(topNode);
0144     _svtxevalstack->set_strict(_strict);
0145     _svtxevalstack->set_verbosity(verbosity+1);
0146   } else {
0147     _svtxevalstack->next_event(topNode);
0148   }
0149   
0150   //-----------------------------------
0151   // print what is coming into the code
0152   //-----------------------------------
0153   
0154   printInputInfo(topNode);
0155   
0156   //---------------------------
0157   // fill the Evaluator NTuples
0158   //---------------------------
0159 
0160   fillOutputNtuples(topNode);
0161   
0162   //--------------------------------------------------
0163   // Print out the ancestry information for this event
0164   //--------------------------------------------------
0165   
0166   printOutputInfo(topNode);
0167   
0168   ++_ievent;
0169   return Fun4AllReturnCodes::EVENT_OK;
0170 }
0171 
0172 int psTOFTimezeroEval::End(PHCompositeNode *topNode) {
0173 
0174   _tfile->cd();
0175 
0176   if (_ntp_vertex)  _ntp_vertex->Write();
0177   if (_ntp_gpoint)  _ntp_gpoint->Write();
0178   if (_ntp_g4hit)   _ntp_g4hit->Write();
0179   if (_ntp_hit)     _ntp_hit->Write();
0180   if (_ntp_cluster) _ntp_cluster->Write();
0181   if (_ntp_gtrack)  _ntp_gtrack->Write();
0182   if (_ntp_track)   _ntp_track->Write();
0183 
0184   _tfile->Close();
0185 
0186   delete _tfile;
0187 
0188   if (verbosity >  0) {
0189     cout << "========================= psTOFTimezeroEval::End() ============================" << endl;
0190     cout << " " << _ievent << " events of output written to: " << _filename << endl;
0191     cout << "===========================================================================" << endl;
0192   }
0193 
0194   _errors += _svtxevalstack->get_errors();
0195   
0196   if (verbosity > -1) {
0197     if ((_errors > 0)||(verbosity > 0)) {
0198       cout << "psTOFTimezeroEval::End() - Error Count: " << _errors << endl;
0199     }
0200   }
0201   
0202   delete _svtxevalstack;
0203   
0204   return Fun4AllReturnCodes::EVENT_OK;
0205 }
0206 
0207 void psTOFTimezeroEval::printInputInfo(PHCompositeNode *topNode) {
0208   
0209   if (verbosity > 1) cout << "psTOFTimezeroEval::printInputInfo() entered" << endl;
0210 
0211   if (verbosity > 3) {
0212     
0213     // event information
0214     cout << endl;
0215     cout << PHWHERE << "   INPUT FOR EVENT " << _ievent << endl;
0216 
0217     cout << endl;
0218     cout << "---PHG4HITS-------------" << endl;
0219     _svtxevalstack->get_truth_eval()->set_strict(_strict);
0220     std::set<PHG4Hit*> g4hits = _svtxevalstack->get_truth_eval()->all_truth_hits();
0221     unsigned int ig4hit = 0;
0222     for(std::set<PHG4Hit*>::iterator iter = g4hits.begin();
0223     iter != g4hits.end();
0224     ++iter) {
0225       PHG4Hit *g4hit = *iter;
0226       cout << ig4hit << " of " << g4hits.size();
0227       cout << ": PHG4Hit: " << endl;
0228       g4hit->identify();
0229       ++ig4hit;
0230     }
0231 
0232     cout << "---SVTXCLUSTERS-------------" << endl;
0233     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
0234     if (clustermap) {
0235       unsigned int icluster = 0;
0236       for (SvtxClusterMap::Iter iter = clustermap->begin();
0237        iter != clustermap->end();
0238        ++iter) {
0239     SvtxCluster* cluster = iter->second;
0240     cout << icluster << " of " << clustermap->size();     
0241     cout << ": SvtxCluster: " << endl;
0242     cluster->identify();
0243     ++icluster;
0244       }
0245     }
0246 
0247     cout << "---SVXTRACKS-------------" << endl;
0248     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap");
0249     if (trackmap) {
0250       unsigned int itrack = 0;
0251       for (SvtxTrackMap::Iter iter = trackmap->begin();
0252        iter != trackmap->end();
0253        ++iter) {
0254     cout << itrack << " of " << trackmap->size();
0255     SvtxTrack *track = iter->second;
0256     cout << " : SvtxTrack:" << endl;
0257     track->identify();
0258     cout << endl;
0259       }
0260     }
0261     
0262     cout << "---SVXVERTEXES-------------" << endl;
0263     SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap");
0264     if (vertexmap) {
0265       unsigned int ivertex = 0;
0266       for (SvtxVertexMap::Iter iter = vertexmap->begin();
0267        iter != vertexmap->end();
0268        ++iter) {
0269     cout << ivertex << " of " << vertexmap->size();
0270     SvtxVertex *vertex = iter->second;
0271     cout << " : SvtxVertex:" << endl;
0272     vertex->identify();
0273     cout << endl;
0274       }
0275     }
0276   }
0277 
0278   return;
0279 }
0280 
0281 void psTOFTimezeroEval::printOutputInfo(PHCompositeNode *topNode) {
0282   
0283   if (verbosity > 1) cout << "psTOFTimezeroEval::printOutputInfo() entered" << endl;
0284 
0285   //==========================================
0286   // print out some useful stuff for debugging
0287   //==========================================
0288 
0289   if (verbosity > 0) {
0290     
0291     SvtxTrackEval*     trackeval = _svtxevalstack->get_track_eval();
0292     SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval();
0293     SvtxTruthEval*     trutheval = _svtxevalstack->get_truth_eval();
0294   
0295     // event information
0296     cout << endl;
0297     cout << PHWHERE << "   NEW OUTPUT FOR EVENT " << _ievent << endl;
0298     cout << endl;
0299 
0300     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo");
0301     
0302     PHG4VtxPoint *gvertex = truthinfo->GetPrimaryVtx( truthinfo->GetPrimaryVertexIndex() );
0303     float gvx = gvertex->get_x();
0304     float gvy = gvertex->get_y();
0305     float gvz = gvertex->get_z();
0306 
0307     float vx = NAN;
0308     float vy = NAN;
0309     float vz = NAN;
0310 
0311     SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap");    
0312     if (vertexmap) {
0313       if (!vertexmap->empty()) {
0314     SvtxVertex* vertex = (vertexmap->begin()->second);
0315     
0316     vx = vertex->get_x();
0317     vy = vertex->get_y();
0318     vz = vertex->get_z();
0319       }
0320     }
0321 
0322     cout << "===Vertex Reconstruction=======================" << endl;
0323     cout << "vtrue = (" << gvx << "," << gvy << "," << gvz << ") => vreco = (" << vx << "," << vy << "," << vz << ")" << endl;
0324     cout << endl;
0325 
0326     cout << "===Tracking Summary============================" << endl;
0327     unsigned int ng4hits[100] = {0};
0328     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits();
0329     for (std::set<PHG4Hit*>::iterator iter = g4hits.begin();
0330      iter != g4hits.end();
0331      ++iter) {
0332       PHG4Hit *g4hit = *iter;
0333       ++ng4hits[g4hit->get_layer()];
0334     }
0335 
0336     SvtxHitMap* hitmap = findNode::getClass<SvtxHitMap>(topNode,"SvtxHitMap");
0337     unsigned int nhits[100] = {0};
0338     if (hitmap) {
0339       for (SvtxHitMap::Iter iter = hitmap->begin();
0340        iter != hitmap->end();
0341        ++iter) {
0342     SvtxHit* hit = iter->second;
0343     ++nhits[hit->get_layer()];
0344       }
0345     }
0346     
0347     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
0348     unsigned int nclusters[100] = {0};
0349     if (clustermap) {
0350       for (SvtxClusterMap::Iter iter = clustermap->begin();
0351        iter != clustermap->end();
0352        ++iter) {
0353     SvtxCluster* cluster = iter->second;
0354     ++nclusters[cluster->get_layer()];
0355       }
0356     }
0357 
0358     for (unsigned int ilayer = 0; ilayer < 100; ++ilayer) {
0359       cout << "layer " << ilayer << ": nG4hits = " << ng4hits[ilayer]
0360        << " => nHits = " << nhits[ilayer]
0361        << " => nClusters = " << nclusters[ilayer] << endl;
0362     }
0363 
0364     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap");
0365     
0366     cout << "nGtracks = " << std::distance(truthinfo->GetPrimaryParticleRange().first,
0367                       truthinfo->GetPrimaryParticleRange().second);
0368     cout << " => nTracks = ";
0369     if (trackmap) cout << trackmap->size() << endl;
0370     else cout << 0 << endl;
0371 
0372     // cluster wise information
0373     if (verbosity > 1) {
0374  
0375       for(std::set<PHG4Hit*>::iterator iter = g4hits.begin();
0376       iter != g4hits.end();
0377       ++iter) {
0378     PHG4Hit *g4hit = *iter;
0379 
0380     cout << endl;
0381         cout << "===PHG4Hit===================================" << endl;
0382     cout << " PHG4Hit: "; g4hit->identify();
0383 
0384     std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit);
0385 
0386     for (std::set<SvtxCluster*>::iterator jter = clusters.begin();
0387          jter != clusters.end();
0388          ++jter) {
0389       SvtxCluster *cluster = *jter;
0390       cout << "===Created-SvtxCluster================" << endl;      
0391       cout << "SvtxCluster: "; cluster->identify();
0392     }
0393       }
0394 
0395       PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange();
0396       for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
0397        iter != range.second; 
0398        ++iter) {
0399     
0400     PHG4Particle *particle = iter->second;
0401 
0402     // track-wise information
0403     cout << endl;
0404 
0405     cout << "=== Gtrack ===================================================" << endl;
0406     cout << " PHG4Particle id = " << particle->get_track_id() << endl;
0407     particle->identify();
0408     cout << " ptrue = (";
0409     cout.width(5); cout << particle->get_px();
0410     cout << ",";
0411     cout.width(5); cout << particle->get_py();
0412     cout << ",";
0413     cout.width(5); cout << particle->get_pz();
0414     cout << ")" << endl;
0415 
0416     cout << " vtrue = (";
0417     cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_x();
0418     cout << ",";
0419     cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_y();
0420     cout << ",";
0421     cout.width(5); cout << truthinfo->GetVtx(particle->get_vtx_id())->get_z();
0422     cout << ")" << endl;
0423       
0424     cout << " pt = " << sqrt(pow(particle->get_px(),2)+pow(particle->get_py(),2)) << endl;
0425     cout << " phi = " << atan2(particle->get_py(),particle->get_px()) << endl;
0426     cout << " eta = " << asinh(particle->get_pz()/sqrt(pow(particle->get_px(),2)+pow(particle->get_py(),2))) << endl;
0427       
0428     cout << " embed flag = " << truthinfo->isEmbeded(particle->get_track_id()) << endl;
0429 
0430     cout << " ---Associated-PHG4Hits-----------------------------------------" << endl;
0431     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(particle);
0432     for(std::set<PHG4Hit*>::iterator jter = g4hits.begin();
0433         jter != g4hits.end();
0434         ++jter) {
0435       PHG4Hit *g4hit = *jter;
0436 
0437       float x = 0.5*(g4hit->get_x(0)+g4hit->get_x(1));
0438       float y = 0.5*(g4hit->get_y(0)+g4hit->get_y(1));
0439       float z = 0.5*(g4hit->get_z(0)+g4hit->get_z(1));
0440           
0441       cout << " #" << g4hit->get_hit_id() << " xtrue = (";
0442       cout.width(5); cout << x;
0443       cout << ",";
0444       cout.width(5); cout << y;
0445       cout << ",";
0446       cout.width(5); cout << z;
0447       cout << ")";
0448 
0449       std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit);
0450       for (std::set<SvtxCluster*>::iterator kter = clusters.begin();
0451            kter != clusters.end();
0452            ++kter) {
0453       
0454         SvtxCluster *cluster = *kter;
0455 
0456         float x = cluster->get_x();
0457         float y = cluster->get_y();
0458         float z = cluster->get_z();
0459          
0460         cout << " => #" << cluster->get_id(); 
0461         cout << " xreco = (";
0462         cout.width(5); cout << x;
0463         cout << ",";
0464         cout.width(5); cout << y;
0465         cout << ",";
0466         cout.width(5); cout << z;
0467         cout << ")";
0468       }
0469 
0470       cout << endl;
0471     }
0472 
0473     if (trackmap&&clustermap) {
0474 
0475       std::set<SvtxTrack*> tracks = trackeval->all_tracks_from(particle);
0476       for (std::set<SvtxTrack*>::iterator jter = tracks.begin();
0477            jter != tracks.end();
0478            ++jter) {
0479       
0480         SvtxTrack *track = *jter;
0481 
0482         float px = track->get_px();
0483         float py = track->get_py();
0484         float pz = track->get_pz();
0485 
0486         cout << "===Created-SvtxTrack==========================================" << endl;
0487         cout << " SvtxTrack id = " << track->get_id() << endl;
0488         cout << " preco = (";
0489         cout.width(5); cout << px;
0490         cout << ",";
0491         cout.width(5); cout << py;
0492         cout << ",";
0493         cout.width(5); cout << pz;
0494         cout << ")" << endl;
0495         cout << " quality = " << track->get_quality() << endl;
0496         cout << " nfromtruth = " << trackeval->get_nclusters_contribution(track,particle) << endl;
0497 
0498         cout << " ---Associated-SvtxClusters-to-PHG4Hits-------------------------" << endl;    
0499 
0500         for (SvtxTrack::ConstClusterIter iter = track->begin_clusters();
0501          iter != track->end_clusters();
0502          ++iter) {
0503           unsigned int cluster_id = *iter;
0504           SvtxCluster* cluster = clustermap->get(cluster_id);
0505                   
0506           float x = cluster->get_x();
0507           float y = cluster->get_y();
0508           float z = cluster->get_z();
0509               
0510           cout << " #" << cluster->get_id() << " xreco = (";
0511           cout.width(5); cout << x;
0512           cout << ",";
0513           cout.width(5); cout << y;
0514           cout << ",";
0515           cout.width(5); cout << z;
0516           cout << ") =>";
0517 
0518           PHG4Hit* g4hit = clustereval->max_truth_hit_by_energy(cluster);
0519           if ((g4hit) && (g4hit->get_trkid() == particle->get_track_id())) {
0520               
0521         x = 0.5*(g4hit->get_x(0)+g4hit->get_x(1));
0522         y = 0.5*(g4hit->get_y(0)+g4hit->get_y(1));
0523         z = 0.5*(g4hit->get_z(0)+g4hit->get_z(1));
0524                 
0525         cout << " #" << g4hit->get_hit_id()
0526              << " xtrue = (";
0527         cout.width(5); cout << x;
0528         cout << ",";
0529         cout.width(5); cout << y;
0530         cout << ",";
0531         cout.width(5); cout << z;
0532         cout << ") => Gtrack id = " << g4hit->get_trkid();
0533           } else {
0534         cout << " noise hit";
0535           }
0536         }
0537   
0538         cout << endl;
0539       }
0540     }
0541       }
0542     }
0543       
0544     cout << endl;
0545 
0546   } // if verbosity
0547 
0548   return;
0549 }
0550 
0551 void psTOFTimezeroEval::fillOutputNtuples(PHCompositeNode *topNode) {
0552 
0553   if (verbosity > 1) cout << "psTOFTimezeroEval::fillOutputNtuples() entered" << endl;
0554 
0555   SvtxVertexEval*   vertexeval = _svtxevalstack->get_vertex_eval();
0556   SvtxTrackEval*     trackeval = _svtxevalstack->get_track_eval();
0557   SvtxClusterEval* clustereval = _svtxevalstack->get_cluster_eval();
0558   SvtxHitEval*         hiteval = _svtxevalstack->get_hit_eval();
0559   SvtxTruthEval*     trutheval = _svtxevalstack->get_truth_eval();
0560   
0561   //-----------------------
0562   // fill the Vertex NTuple
0563   //-----------------------
0564 
0565   if (_ntp_vertex) {
0566     //cout << "Filling ntp_vertex " << endl;
0567     SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap");
0568     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo");
0569     if (vertexmap && truthinfo) {
0570       for (SvtxVertexMap::Iter iter = vertexmap->begin();
0571        iter != vertexmap->end();
0572        ++iter) {
0573     SvtxVertex* vertex = iter->second;
0574     PHG4VtxPoint* point = vertexeval->max_truth_point_by_ntracks(vertex);
0575 
0576     float vx         = vertex->get_x();
0577     float vy         = vertex->get_y();
0578     float vz         = vertex->get_z();
0579     float ntracks    = vertex->size_tracks();
0580 
0581     float gvx        = NAN;
0582     float gvy        = NAN;
0583     float gvz        = NAN;
0584     float gvt        = NAN;
0585     float gntracks   = truthinfo->GetNumPrimaryVertexParticles();
0586     float nfromtruth = NAN;
0587     
0588     if (point) {
0589       gvx        = point->get_x();
0590       gvy        = point->get_y();
0591       gvz        = point->get_z();
0592       gvt        = point->get_t();
0593       gntracks   = truthinfo->GetNumPrimaryVertexParticles();
0594       nfromtruth = vertexeval->get_ntracks_contribution(vertex,point);
0595     }
0596       
0597     float vertex_data[11] = {(float) _ievent,
0598                  vx,
0599                  vy,
0600                  vz,
0601                  ntracks,
0602                  gvx,
0603                  gvy,
0604                  gvz,
0605                  gvt,
0606                  gntracks,
0607                  nfromtruth
0608     };
0609 
0610     /*
0611     cout << "vertex: " 
0612          << " ievent " << vertex_data[0]
0613          << " vx " << vertex_data[1]
0614          << " vy " << vertex_data[2]
0615          << " vz " << vertex_data[3]
0616          << endl;
0617     */
0618 
0619     _ntp_vertex->Fill(vertex_data);      
0620       }
0621     }
0622   }
0623   
0624   //-----------------------
0625   // fill the gpoint NTuple
0626   //-----------------------
0627   
0628   if (_ntp_gpoint) {
0629     //cout << "Filling ntp_gpoint " << endl;    
0630     SvtxVertexMap* vertexmap = findNode::getClass<SvtxVertexMap>(topNode,"SvtxVertexMap");
0631     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo");
0632 
0633     if (vertexmap && truthinfo) {
0634 
0635       PHG4VtxPoint* point =  truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex());
0636 
0637       if (point) {
0638       
0639     SvtxVertex* vertex = vertexeval->best_vertex_from(point);
0640     
0641     float gvx        = point->get_x();
0642     float gvy        = point->get_y();
0643     float gvz        = point->get_z();
0644     float gvt        = point->get_t();
0645     float gntracks   = truthinfo->GetNumPrimaryVertexParticles();
0646     float vx         = NAN;
0647     float vy         = NAN;
0648     float vz         = NAN;
0649     float ntracks    = NAN;
0650     float nfromtruth = NAN;
0651 
0652     if (vertex) {
0653       vx         = vertex->get_x();
0654       vy         = vertex->get_y();
0655       vz         = vertex->get_z();
0656       ntracks    = vertex->size_tracks();
0657       nfromtruth = vertexeval->get_ntracks_contribution(vertex,point);
0658     }
0659     
0660     float gpoint_data[11] = {(float) _ievent,
0661                  gvx,
0662                  gvy,
0663                  gvz,
0664                  gvt,
0665                  gntracks,
0666                  vx,
0667                  vy,
0668                  vz,
0669                  ntracks,
0670                  nfromtruth
0671     };
0672 
0673     _ntp_gpoint->Fill(gpoint_data);      
0674       }
0675     }
0676   }
0677   
0678   //---------------------
0679   // fill the G4hit NTuple
0680   //---------------------
0681 
0682   if (_ntp_g4hit) {
0683     //cout << "Filling ntp_g4hit " << endl;
0684     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits();
0685     for (std::set<PHG4Hit*>::iterator iter = g4hits.begin();
0686      iter != g4hits.end();
0687      ++iter) {
0688             
0689       PHG4Hit *g4hit = *iter;
0690       PHG4Particle *g4particle = trutheval->get_particle(g4hit);
0691       
0692       float g4hitID   = g4hit->get_hit_id();
0693       float gx        = g4hit->get_avg_x();
0694       float gy        = g4hit->get_avg_y();
0695       float gz        = g4hit->get_avg_z();
0696       float gt        = g4hit->get_avg_t();
0697       float gedep     = g4hit->get_edep();
0698       float glayer    = g4hit->get_layer();
0699   
0700       float gtrackID  = g4hit->get_trkid();
0701 
0702       float gflavor   = NAN;
0703       float gpx       = NAN;
0704       float gpy       = NAN;
0705       float gpz       = NAN;
0706 
0707       float gvx       = NAN;
0708       float gvy       = NAN;
0709       float gvz       = NAN;
0710 
0711       float gembed  = NAN;
0712       float gprimary = NAN;
0713 
0714       float gfpx      = 0.;
0715       float gfpy      = 0.;
0716       float gfpz      = 0.;
0717       float gfx       = 0.;
0718       float gfy       = 0.;
0719       float gfz       = 0.;
0720 
0721       if (g4particle) {
0722 
0723     if (_scan_for_embedded) {
0724       if (trutheval->get_embed(g4particle) <= 0) continue;
0725     }
0726     
0727     gflavor   = g4particle->get_pid();
0728     gpx       = g4particle->get_px();
0729     gpy       = g4particle->get_py();
0730     gpz       = g4particle->get_pz();
0731 
0732     PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);  
0733 
0734     if (vtx) {
0735       gvx       = vtx->get_x();
0736       gvy       = vtx->get_y();
0737       gvz       = vtx->get_z();
0738     }
0739     
0740     PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); 
0741     if (outerhit) {
0742       gfpx      = outerhit->get_px(1);
0743       gfpy      = outerhit->get_py(1);
0744       gfpz      = outerhit->get_pz(1);
0745       gfx       = outerhit->get_x(1);
0746       gfy       = outerhit->get_y(1);
0747       gfz       = outerhit->get_z(1);
0748     }
0749     
0750     gembed    = trutheval->get_embed(g4particle);
0751     gprimary  = trutheval->is_primary(g4particle);
0752       } //       if (g4particle)
0753       
0754       std::set<SvtxCluster*> clusters = clustereval->all_clusters_from(g4hit);  
0755       float nclusters = clusters.size();
0756 
0757       // best cluster reco'd
0758       SvtxCluster* cluster = clustereval->best_cluster_from(g4hit);
0759 
0760       float clusID     = NAN;
0761       float x          = NAN;
0762       float y          = NAN;
0763       float z          = NAN;
0764       float e          = NAN;
0765       float adc        = NAN;
0766       float layer      = NAN;
0767       float size       = NAN;
0768       float phisize    = NAN;
0769       float zsize      = NAN;
0770       float efromtruth = NAN;
0771 
0772       if (cluster) {
0773     clusID     = cluster->get_id();
0774     x          = cluster->get_x();
0775     y          = cluster->get_y();
0776     z          = cluster->get_z();
0777     e          = cluster->get_e();
0778     adc        = cluster->get_adc();
0779     layer      = cluster->get_layer();
0780     size       = cluster->size_hits();
0781     phisize    = cluster->get_phi_size();
0782     zsize      = cluster->get_z_size();
0783     if (g4particle) {
0784       efromtruth = clustereval->get_energy_contribution(cluster,g4particle);
0785     }
0786       }
0787 
0788       float g4hit_data[36] = {(float) _ievent,
0789                   g4hitID,
0790                   gx,
0791                   gy,
0792                   gz,
0793                   gt,
0794                   gedep,
0795                   glayer,
0796                   gtrackID,
0797                   gflavor,
0798                   gpx,
0799                   gpy,
0800                   gpz,
0801                   gvx,
0802                   gvy,
0803                   gvz,
0804                   gfpx,
0805                   gfpy,
0806                   gfpz,
0807                   gfx,
0808                   gfy,
0809                   gfz,
0810                   gembed,
0811                   gprimary,
0812                   nclusters,
0813                   clusID,  
0814                   x,      
0815                   y,      
0816                   z,      
0817                   e,      
0818                   adc,    
0819                   layer,  
0820                   size,   
0821                   phisize,
0822                   zsize,  
0823                   efromtruth
0824       };
0825 
0826       _ntp_g4hit->Fill(g4hit_data);
0827     }
0828   }
0829   
0830   //--------------------
0831   // fill the Hit NTuple
0832   //--------------------
0833 
0834   if (_ntp_hit) {
0835     //cout << "Filling ntp_hit " << endl;
0836     // need things off of the DST...
0837     SvtxHitMap* hitmap = findNode::getClass<SvtxHitMap>(topNode,"SvtxHitMap");
0838     if (hitmap) {
0839 
0840       for (SvtxHitMap::Iter iter = hitmap->begin();
0841        iter != hitmap->end();
0842        ++iter) {
0843 
0844     SvtxHit* hit             = iter->second;
0845     PHG4Hit* g4hit           = hiteval->max_truth_hit_by_energy(hit);
0846     PHG4Cell* g4cell = hiteval->get_cell(hit);
0847     PHG4Particle* g4particle = trutheval->get_particle(g4hit);
0848 
0849     float event  = _ievent;
0850     float hitID  = hit->get_id();
0851     float e      = hit->get_e();
0852     float adc    = hit->get_adc();
0853     float layer  = hit->get_layer();
0854     float cellID = hit->get_cellid();
0855     float ecell  = g4cell->get_edep();
0856 
0857     float g4hitID  = NAN;
0858     float gedep    = NAN;
0859     float gx       = NAN;
0860     float gy       = NAN;
0861     float gz       = NAN;
0862     float gt       = NAN;
0863     float gtrackID = NAN;
0864     float gflavor  = NAN;
0865     float gpx      = NAN;
0866     float gpy      = NAN;
0867     float gpz      = NAN;
0868     float gvx      = NAN;
0869     float gvy      = NAN;
0870     float gvz      = NAN;
0871     float gfpx     = NAN;
0872     float gfpy     = NAN;
0873     float gfpz     = NAN;
0874     float gfx      = NAN;
0875     float gfy      = NAN;
0876     float gfz      = NAN;
0877     float gembed   = NAN;
0878     float gprimary = NAN;
0879       
0880     float efromtruth = NAN;
0881       
0882     if (g4hit) {
0883       g4hitID  = g4hit->get_hit_id();
0884       gedep    = g4hit->get_edep();
0885       gx       = g4hit->get_avg_x();
0886       gy       = g4hit->get_avg_y();
0887       gz       = g4hit->get_avg_z();
0888       gt       = g4hit->get_avg_t();
0889 
0890       if (g4particle) {
0891 
0892         if (_scan_for_embedded) {
0893           if (trutheval->get_embed(g4particle) <= 0) continue;
0894         }
0895         
0896         gtrackID = g4particle->get_track_id();
0897         gflavor  = g4particle->get_pid();
0898         gpx      = g4particle->get_px();
0899         gpy      = g4particle->get_py();
0900         gpz      = g4particle->get_pz();
0901 
0902         PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
0903 
0904         if (vtx) {
0905           gvx      = vtx->get_x();
0906           gvy      = vtx->get_y();
0907           gvz      = vtx->get_z();
0908         }
0909 
0910         PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); 
0911         if (outerhit) {
0912           gfpx     = outerhit->get_px(1);
0913           gfpy     = outerhit->get_py(1);
0914           gfpz     = outerhit->get_pz(1);
0915           gfx      = outerhit->get_x(1);
0916           gfy      = outerhit->get_y(1);
0917           gfz      = outerhit->get_z(1);
0918         }
0919         gembed   = trutheval->get_embed(g4particle);
0920         gprimary = trutheval->is_primary(g4particle);
0921       } //   if (g4particle){
0922     }      
0923 
0924     if (g4particle) {
0925       efromtruth = hiteval->get_energy_contribution(hit,g4particle);
0926     }
0927 
0928     float hit_data[33] = {
0929       event,
0930       hitID,
0931       e,
0932       adc,
0933       layer,
0934       cellID,
0935       ecell,
0936       g4hitID,
0937       gedep,
0938       gx,
0939       gy,
0940       gz,
0941       gt,
0942       gtrackID,
0943       gflavor,
0944       gpx,
0945       gpy,
0946       gpz,
0947       gvx,
0948       gvy,
0949       gvz,
0950       gfpx,
0951       gfpy,
0952       gfpz,
0953       gfx,
0954       gfy,
0955       gfz,
0956       gembed,
0957       gprimary,
0958       efromtruth
0959     };
0960       
0961     _ntp_hit->Fill(hit_data);     
0962       }
0963     }
0964   }
0965   
0966   //------------------------
0967   // fill the Cluster NTuple
0968   //------------------------
0969 
0970   //cout << "check for ntp_cluster" << endl;
0971 
0972   if (_ntp_cluster && !_scan_for_embedded) {
0973     //cout << "Filling ntp_cluster 1 " << endl;
0974     // need things off of the DST...
0975     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
0976     if (clustermap) {
0977 
0978       for (SvtxClusterMap::Iter iter = clustermap->begin();
0979        iter != clustermap->end();
0980        ++iter) {
0981     
0982     SvtxCluster* cluster     = iter->second;   
0983     SvtxTrack* track = trackeval->best_track_from(cluster);
0984     
0985     PHG4Hit *g4hit           = clustereval->max_truth_hit_by_energy(cluster); 
0986     PHG4Particle *g4particle = trutheval->get_particle(g4hit);
0987     
0988     float hitID    = cluster->get_id();
0989     float x        = cluster->get_x();
0990     float y        = cluster->get_y();
0991     float z        = cluster->get_z();
0992 
0993     float ex       = sqrt(cluster->get_error(0,0));
0994     float ey       = sqrt(cluster->get_error(1,1));
0995     float ez       = cluster->get_z_error();
0996 
0997     float ephi     = cluster->get_rphi_error();
0998     
0999     float e        = cluster->get_e();
1000     float adc      = cluster->get_adc();
1001     float layer    = cluster->get_layer();
1002     float size     = cluster->size_hits();
1003     float phisize  = cluster->get_phi_size();
1004     float zsize    = cluster->get_z_size();
1005 
1006     float trackID  = NAN;
1007     if (track) trackID = track->get_id();
1008 
1009     float g4hitID  = NAN;
1010     float gx       = NAN;
1011     float gy       = NAN;
1012     float gz       = NAN;
1013     float gt       = NAN;
1014     float gtrackID = NAN;
1015     float gflavor  = NAN;
1016     float gpx      = NAN;
1017     float gpy      = NAN;
1018     float gpz      = NAN;
1019     float gvx      = NAN;
1020     float gvy      = NAN;
1021     float gvz      = NAN;
1022     float gfpx     = NAN;
1023     float gfpy     = NAN;
1024     float gfpz     = NAN;
1025     float gfx      = NAN;
1026     float gfy      = NAN;
1027     float gfz      = NAN;
1028     float gembed   = NAN;
1029     float gprimary = NAN;
1030     
1031     float efromtruth = NAN;
1032       
1033     if (g4hit) {
1034       g4hitID  = g4hit->get_hit_id();
1035       gx       = g4hit->get_avg_x();
1036       gy       = g4hit->get_avg_y();
1037       gz       = g4hit->get_avg_z();
1038       gt       = g4hit->get_avg_t();
1039 
1040       if (g4particle) {
1041 
1042         gtrackID = g4particle->get_track_id();
1043         gflavor  = g4particle->get_pid();
1044         gpx      = g4particle->get_px();
1045         gpy      = g4particle->get_py();
1046         gpz      = g4particle->get_pz();
1047 
1048         PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
1049         if (vtx) {
1050           gvx      = vtx->get_x();
1051           gvy      = vtx->get_y();
1052           gvz      = vtx->get_z();
1053         }
1054 
1055         PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); 
1056         if (outerhit) {
1057           gfpx     = outerhit->get_px(1);
1058           gfpy     = outerhit->get_py(1);
1059           gfpz     = outerhit->get_pz(1);
1060           gfx      = outerhit->get_x(1);
1061           gfy      = outerhit->get_y(1);
1062           gfz      = outerhit->get_z(1);
1063         }
1064         
1065         gembed   = trutheval->get_embed(g4particle);
1066         gprimary = trutheval->is_primary(g4particle);
1067       }      //   if (g4particle){
1068     } //  if (g4hit) {
1069 
1070     if (g4particle){
1071       efromtruth = clustereval->get_energy_contribution(cluster,g4particle);
1072     }
1073 
1074     float cluster_data[38] = {(float) _ievent,
1075                   hitID,
1076                   x,
1077                   y,
1078                   z,
1079                   ex,
1080                   ey,
1081                   ez,
1082                   ephi,
1083                   e,
1084                   adc,
1085                   layer,
1086                   size,
1087                   phisize,
1088                   zsize,
1089                   trackID,
1090                   g4hitID,
1091                   gx,
1092                   gy,
1093                   gz,
1094                   gt,
1095                   gtrackID,
1096                   gflavor,
1097                   gpx,
1098                   gpy,
1099                   gpz,
1100                   gvx,
1101                   gvy,
1102                   gvz,
1103                   gfpx,
1104                   gfpy,
1105                   gfpz,
1106                   gfx,
1107                   gfy,
1108                   gfz,
1109                   gembed,
1110                   gprimary,
1111                   efromtruth};
1112 
1113     _ntp_cluster->Fill(cluster_data);
1114       }       
1115     }
1116     
1117   } else if (_ntp_cluster && _scan_for_embedded) {
1118 
1119     //cout << "Filling ntp_cluster 2 " << endl;
1120 
1121     // if only scanning embedded signals, loop over all the tracks from
1122     // embedded particles and report all of their clusters, including those
1123     // from other sources (noise hits on the embedded track)
1124     
1125     // need things off of the DST...
1126     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap");
1127     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
1128     if (trackmap) {
1129       
1130       for (SvtxTrackMap::Iter iter = trackmap->begin();
1131        iter != trackmap->end();
1132        ++iter) {
1133     
1134     SvtxTrack* track = iter->second;
1135     PHG4Particle* truth = trackeval->max_truth_particle_by_nclusters(track);
1136     if (truth) {      
1137       if (trutheval->get_embed(truth) <= 0) continue;
1138     }
1139     
1140     for (SvtxTrack::ConstClusterIter iter = track->begin_clusters();
1141          iter != track->end_clusters();
1142          ++iter) {
1143 
1144       unsigned int cluster_id = *iter;
1145       SvtxCluster* cluster = clustermap->get(cluster_id);
1146 
1147       PHG4Hit *g4hit           = clustereval->max_truth_hit_by_energy(cluster); 
1148       PHG4Particle *g4particle = trutheval->get_particle(g4hit);
1149     
1150       float hitID    = cluster->get_id();
1151       float x        = cluster->get_x();
1152       float y        = cluster->get_y();
1153       float z        = cluster->get_z();
1154 
1155       float ex       = sqrt(cluster->get_error(0,0));
1156       float ey       = sqrt(cluster->get_error(1,1));
1157       float ez       = cluster->get_z_error();
1158 
1159       float ephi     = cluster->get_rphi_error();
1160       
1161       float e        = cluster->get_e();
1162       float adc      = cluster->get_adc();
1163       float layer    = cluster->get_layer();
1164       float size     = cluster->size_hits();
1165       float phisize  = cluster->get_phi_size();
1166       float zsize    = cluster->get_z_size();
1167 
1168       float trackID  = NAN;
1169       if (track) trackID = track->get_id();
1170 
1171       float g4hitID  = NAN;
1172       float gx       = NAN;
1173       float gy       = NAN;
1174       float gz       = NAN;
1175       float gt       = NAN;
1176       float gtrackID = NAN;
1177       float gflavor  = NAN;
1178       float gpx      = NAN;
1179       float gpy      = NAN;
1180       float gpz      = NAN;
1181       float gvx      = NAN;
1182       float gvy      = NAN;
1183       float gvz      = NAN;
1184       float gfpx     = NAN;
1185       float gfpy     = NAN;
1186       float gfpz     = NAN;
1187       float gfx      = NAN;
1188       float gfy      = NAN;
1189       float gfz      = NAN;
1190       float gembed   = NAN;
1191       float gprimary = NAN;
1192     
1193       float efromtruth = NAN;
1194       
1195       if (g4hit) {
1196         g4hitID  = g4hit->get_hit_id();
1197         gx       = g4hit->get_avg_x();
1198         gy       = g4hit->get_avg_y();
1199       gz       = g4hit->get_avg_z();
1200       gt       = g4hit->get_avg_t();
1201 
1202         if (g4particle) {
1203         
1204           gtrackID = g4particle->get_track_id();
1205           gflavor  = g4particle->get_pid();
1206           gpx      = g4particle->get_px();
1207           gpy      = g4particle->get_py();
1208           gpz      = g4particle->get_pz();
1209 
1210           PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);
1211           if (vtx) {
1212         gvx      = vtx->get_x();
1213         gvy      = vtx->get_y();
1214         gvz      = vtx->get_z();
1215           }
1216 
1217           PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle);   
1218           if (outerhit) {
1219         gfpx     = outerhit->get_px(1);
1220         gfpy     = outerhit->get_py(1);
1221         gfpz     = outerhit->get_pz(1);
1222         gfx      = outerhit->get_x(1);
1223         gfy      = outerhit->get_y(1);
1224         gfz      = outerhit->get_z(1);
1225           }
1226         
1227           gembed   = trutheval->get_embed(g4particle);
1228           gprimary = trutheval->is_primary(g4particle);
1229         }      //   if (g4particle){
1230       } //  if (g4hit) {
1231 
1232       if (g4particle){
1233         efromtruth = clustereval->get_energy_contribution(cluster,g4particle);
1234       }
1235 
1236       float cluster_data[38] = {(float) _ievent,
1237                     hitID,
1238                     x,
1239                     y,
1240                     z,
1241                     ex,
1242                     ey,
1243                     ez,
1244                     ephi,
1245                     e,
1246                     adc,
1247                     layer,
1248                     size,
1249                     phisize,
1250                     zsize,
1251                     trackID,
1252                     g4hitID,
1253                     gx,
1254                     gy,
1255                     gz,
1256                     gt,
1257                     gtrackID,
1258                     gflavor,
1259                     gpx,
1260                     gpy,
1261                     gpz,
1262                     gvx,
1263                     gvy,
1264                     gvz,
1265                     gfpx,
1266                     gfpy,
1267                     gfpz,
1268                     gfx,
1269                     gfy,
1270                     gfz,
1271                     gembed,
1272                     gprimary,
1273                     efromtruth};
1274 
1275       _ntp_cluster->Fill(cluster_data);
1276     }         
1277       }
1278     }
1279   }
1280     
1281   //------------------------
1282   // fill the Gtrack NTuple
1283   //------------------------
1284 
1285   // need things off of the DST...
1286 
1287   //cout << "check for ntp_gtrack" << endl;
1288 
1289   if (_ntp_gtrack) {
1290     //cout << "Filling ntp_gtrack " << endl;
1291 
1292     PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode,"G4TruthInfo");   
1293     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
1294     if (truthinfo) {
1295 
1296       PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange();
1297       for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
1298        iter != range.second; 
1299      ++iter) {
1300     
1301     PHG4Particle* g4particle = iter->second;
1302 
1303     if (_scan_for_embedded) {
1304       if (trutheval->get_embed(g4particle) <= 0) continue;
1305     }
1306     
1307     float gtrackID = g4particle->get_track_id();
1308     float gflavor  = g4particle->get_pid();
1309       
1310     std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle);     
1311     float ng4hits = g4hits.size();  
1312     float gpx      = g4particle->get_px();
1313     float gpy      = g4particle->get_py();
1314     float gpz      = g4particle->get_pz();
1315 
1316     PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);  
1317     float gvx      = vtx->get_x();
1318     float gvy      = vtx->get_y();
1319     float gvz      = vtx->get_z();
1320     float gvt      = vtx->get_t();
1321 
1322     float gfpx      = 0.;
1323     float gfpy      = 0.;
1324     float gfpz      = 0.;
1325     float gfx       = 0.;
1326     float gfy       = 0.;
1327     float gfz       = 0.;
1328     
1329     PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle); 
1330     if (outerhit) {
1331       gfpx      = outerhit->get_px(1);
1332       gfpy      = outerhit->get_py(1);
1333       gfpz      = outerhit->get_pz(1);
1334       gfx       = outerhit->get_x(1);
1335       gfy       = outerhit->get_y(1);
1336       gfz       = outerhit->get_z(1);
1337     }
1338       
1339     float gembed   = trutheval->get_embed(g4particle);
1340     float gprimary = trutheval->is_primary(g4particle);
1341 
1342     SvtxTrack* track = trackeval->best_track_from(g4particle);
1343 
1344     float trackID       = NAN;
1345     float charge        = NAN;
1346     float quality       = NAN;
1347     float chisq         = NAN;
1348     float ndf           = NAN;
1349     float nhits         = NAN;
1350     unsigned int layers = 0x0;
1351     float dca2d         = NAN;
1352     float dca2dsigma    = NAN;
1353     float px            = NAN;
1354     float py            = NAN;
1355     float pz            = NAN;
1356     float pcax          = NAN;
1357     float pcay          = NAN;
1358     float pcaz          = NAN;
1359 
1360     float nfromtruth    = NAN;
1361     float layersfromtruth = NAN;
1362 
1363     float nmaps      = 0;
1364     float nintt      = 0;
1365     float ntpc       = 0;
1366 
1367     if (track) {
1368       trackID   = track->get_id();     
1369       charge    = track->get_charge();
1370       quality   = track->get_quality();
1371       chisq     = track->get_chisq();
1372       ndf       = track->get_ndf();
1373       nhits     = track->size_clusters();
1374 
1375       for (SvtxTrack::ConstClusterIter iter = track->begin_clusters();
1376            iter != track->end_clusters();
1377            ++iter) {
1378         unsigned int cluster_id = *iter;
1379         SvtxCluster* cluster = clustermap->get(cluster_id);
1380         unsigned int layer = cluster->get_layer();
1381         if (layer < 32) layers |= (0x1 << layer);
1382 
1383 
1384           if(layer >= 0 and layer <= 2)  ++nmaps;
1385           if(layer >= 3 and layer <= 6)  ++nintt;
1386           if(layer >= 7 and layer <= 66) ++ntpc;
1387       }
1388 
1389       dca2d     = track->get_dca2d();
1390       dca2dsigma = track->get_dca2d_error();
1391       px        = track->get_px();
1392       py        = track->get_py();
1393       pz        = track->get_pz();
1394       pcax      = track->get_x();
1395       pcay      = track->get_y();
1396       pcaz      = track->get_z();
1397 
1398       nfromtruth = trackeval->get_nclusters_contribution(track,g4particle);
1399       layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track,g4particle);
1400     }
1401       
1402     float gtrack_data[39] = {(float) _ievent,
1403                  gtrackID,
1404                  gflavor,
1405                  ng4hits,
1406                  gpx,
1407                  gpy,
1408                  gpz,
1409                  gvx,
1410                  gvy,
1411                  gvz,
1412                  gvt,
1413                  gfpx,
1414                  gfpy,
1415                  gfpz,
1416                  gfx,
1417                  gfy,
1418                  gfz,
1419                  gembed,
1420                  gprimary,
1421                  trackID,
1422                  px,         
1423                  py,         
1424                  pz,  
1425                  charge,     
1426                  quality,    
1427                  chisq,      
1428                  ndf,        
1429                  nhits,      
1430                  (float) layers,     
1431                  dca2d,      
1432                  dca2dsigma,                   
1433                  pcax,       
1434                  pcay,       
1435                  pcaz,
1436                  nfromtruth,
1437                  layersfromtruth,
1438                     nmaps,
1439                     nintt,
1440                     ntpc
1441     };
1442 
1443     /*
1444     cout << " ievent " << _ievent
1445          << " gtrackID " << gtrackID
1446          << " gflavor " << gflavor
1447          << " ng4hits " << ng4hits
1448          << endl;
1449     */
1450 
1451     _ntp_gtrack->Fill(gtrack_data);
1452 
1453       }      
1454     }
1455   }
1456   
1457   //------------------------
1458   // fill the Track NTuple
1459   //------------------------
1460 
1461 
1462 
1463   if (_ntp_track) {
1464     //cout << "Filling ntp_track " << endl;
1465 
1466     // need things off of the DST...
1467     SvtxTrackMap* trackmap = findNode::getClass<SvtxTrackMap>(topNode,"SvtxTrackMap");
1468     SvtxClusterMap* clustermap = findNode::getClass<SvtxClusterMap>(topNode,"SvtxClusterMap");
1469     if (trackmap) {
1470 
1471       for (SvtxTrackMap::Iter iter = trackmap->begin();
1472        iter != trackmap->end();
1473        ++iter) {
1474     
1475     SvtxTrack* track = iter->second;
1476 
1477     float trackID   = track->get_id();     
1478     float charge    = track->get_charge();
1479     float quality   = track->get_quality();
1480     float chisq     = track->get_chisq();
1481     float ndf       = track->get_ndf();
1482     float nhits     = track->size_clusters();
1483 
1484     float nmaps      = 0;
1485     float nintt      = 0;
1486     float ntpc       = 0;
1487 
1488     unsigned int layers = 0x0;
1489     for (SvtxTrack::ConstClusterIter iter = track->begin_clusters();
1490          iter != track->end_clusters();
1491          ++iter) {
1492       unsigned int cluster_id = *iter;
1493       SvtxCluster* cluster = clustermap->get(cluster_id);
1494       unsigned int layer = cluster->get_layer();
1495       if (layer < 31) layers |= (0x1 << layer);
1496 
1497       if(layer >= 0 and layer <= 2)  ++nmaps;
1498       if(layer >= 3 and layer <= 6)  ++nintt;
1499       if(layer >= 7 and layer <= 66) ++ntpc;
1500     }
1501       
1502     float dca2d     = track->get_dca2d();
1503     float dca2dsigma = track->get_dca2d_error();
1504     float px        = track->get_px();
1505     float py        = track->get_py();
1506     float pz        = track->get_pz();
1507     float pcax      = track->get_x();
1508     float pcay      = track->get_y();
1509     float pcaz      = track->get_z();
1510 
1511     float presdphi = track->get_cal_dphi(SvtxTrack::PRES);
1512     float presdeta = track->get_cal_deta(SvtxTrack::PRES);
1513     float prese3x3 = track->get_cal_energy_3x3(SvtxTrack::PRES);
1514     float prese    = track->get_cal_cluster_e(SvtxTrack::PRES);
1515 
1516     float cemcdphi = track->get_cal_dphi(SvtxTrack::CEMC);
1517     float cemcdeta = track->get_cal_deta(SvtxTrack::CEMC);
1518     float cemce3x3 = track->get_cal_energy_3x3(SvtxTrack::CEMC);
1519     float cemce    = track->get_cal_cluster_e(SvtxTrack::CEMC);
1520 
1521     float hcalindphi = track->get_cal_dphi(SvtxTrack::HCALIN);
1522     float hcalindeta = track->get_cal_deta(SvtxTrack::HCALIN);
1523     float hcaline3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALIN);
1524     float hcaline    = track->get_cal_cluster_e(SvtxTrack::HCALIN);
1525 
1526     float hcaloutdphi = track->get_cal_dphi(SvtxTrack::HCALOUT);
1527     float hcaloutdeta = track->get_cal_deta(SvtxTrack::HCALOUT);
1528     float hcaloute3x3 = track->get_cal_energy_3x3(SvtxTrack::HCALOUT);
1529     float hcaloute    = track->get_cal_cluster_e(SvtxTrack::HCALOUT);
1530 
1531     float gtrackID = NAN;
1532     float gflavor  = NAN;     
1533     float ng4hits  = NAN;
1534     float gpx      = NAN;
1535     float gpy      = NAN;
1536     float gpz      = NAN;
1537     float gvx      = NAN;
1538     float gvy      = NAN;
1539     float gvz      = NAN;
1540     float gvt      = NAN;
1541     float gfpx     = NAN;
1542     float gfpy     = NAN;
1543     float gfpz     = NAN;
1544     float gfx      = NAN;
1545     float gfy      = NAN;
1546     float gfz      = NAN;
1547     float gembed   = NAN;
1548     float gprimary = NAN;
1549 
1550     float nfromtruth = NAN;
1551     float layersfromtruth = NAN;
1552       
1553     PHG4Particle* g4particle = trackeval->max_truth_particle_by_nclusters(track);   
1554     
1555     if (g4particle) {
1556 
1557       if (_scan_for_embedded) {
1558         if (trutheval->get_embed(g4particle) <= 0) continue;
1559       }
1560       
1561       gtrackID = g4particle->get_track_id();
1562       gflavor  = g4particle->get_pid();
1563       
1564       std::set<PHG4Hit*> g4hits = trutheval->all_truth_hits(g4particle);     
1565       ng4hits = g4hits.size();  
1566       gpx      = g4particle->get_px();
1567       gpy      = g4particle->get_py();
1568       gpz      = g4particle->get_pz();
1569     
1570       PHG4VtxPoint* vtx = trutheval->get_vertex(g4particle);    
1571       gvx      = vtx->get_x();
1572       gvy      = vtx->get_y();
1573       gvz      = vtx->get_z();
1574       gvt      = vtx->get_t();
1575 
1576       PHG4Hit* outerhit = trutheval->get_outermost_truth_hit(g4particle);         
1577       if (outerhit) {
1578         gfpx     = outerhit->get_px(1);
1579         gfpy     = outerhit->get_py(1);
1580         gfpz     = outerhit->get_pz(1);
1581         gfx      = outerhit->get_x(1);
1582         gfy      = outerhit->get_y(1);
1583         gfz      = outerhit->get_z(1);
1584       }
1585       gembed   = trutheval->get_embed(g4particle);
1586       gprimary = trutheval->is_primary(g4particle);
1587 
1588       nfromtruth = trackeval->get_nclusters_contribution(track,g4particle);
1589       layersfromtruth = trackeval->get_nclusters_contribution_by_layer(track,g4particle);
1590     }
1591       
1592     float track_data[55] = {(float) _ievent,
1593                 trackID, 
1594                 px,        
1595                 py,        
1596                 pz,      
1597                 charge,  
1598                 quality, 
1599                 chisq,   
1600                 ndf,     
1601                 nhits,   
1602                 (float) layers,
1603                 dca2d,     
1604                 dca2dsigma,      
1605                 pcax,      
1606                 pcay,      
1607                 pcaz,      
1608                 presdphi,
1609                 presdeta,
1610                 prese3x3,
1611                 prese,   
1612                 cemcdphi,
1613                 cemcdeta,
1614                 cemce3x3,
1615                 cemce,   
1616                 hcalindphi,
1617                 hcalindeta,
1618                 hcaline3x3,
1619                 hcaline,   
1620                 hcaloutdphi,
1621                 hcaloutdeta,
1622                 hcaloute3x3,
1623                 hcaloute,
1624                 gtrackID,
1625                 gflavor,
1626                 ng4hits,
1627                 gpx,
1628                 gpy,
1629                 gpz,
1630                 gvx,
1631                 gvy,
1632                 gvz,
1633                 gvt,
1634                 gfpx,
1635                 gfpy,
1636                 gfpz,
1637                 gfx,
1638                 gfy,
1639                 gfz,
1640                 gembed,
1641                 gprimary,
1642                 nfromtruth,
1643                 layersfromtruth,
1644                 nmaps,
1645                 nintt,
1646                 ntpc
1647     };
1648 
1649     /*
1650     cout << "ievent " << _ievent
1651          << " trackID " << trackID
1652          << " nhits " << nhits
1653          << " px " << px
1654          << " py " << py
1655          << " pz " << pz
1656          << " gembed " << gembed
1657          << " gprimary " << gprimary 
1658          << endl;
1659     */
1660     _ntp_track->Fill(track_data);
1661       }
1662     }
1663   }
1664   
1665   return;
1666 }