Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CaloEvaluator.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CaloEvaluator.cc
1 #include "CaloEvaluator.h"
2 
3 #include "CaloEvalStack.h"
4 #include "CaloRawClusterEval.h"
5 #include "CaloRawTowerEval.h"
6 #include "CaloTruthEval.h"
7 
8 #include <g4main/PHG4Particle.h>
9 #include <g4main/PHG4Shower.h>
11 #include <g4main/PHG4VtxPoint.h>
12 
15 
16 #include <calobase/RawCluster.h>
17 #include <calobase/RawClusterContainer.h>
18 #include <calobase/RawClusterUtility.h>
19 #include <calobase/RawTower.h>
20 #include <calobase/RawTowerContainer.h>
21 #include <calobase/RawTowerGeom.h>
22 #include <calobase/RawTowerGeomContainer.h>
23 
25 #include <fun4all/SubsysReco.h>
26 
27 #include <phool/getClass.h>
28 #include <phool/phool.h>
29 
30 #include <TFile.h>
31 #include <TNtuple.h>
32 #include <TTree.h>
33 
34 #include <CLHEP/Vector/ThreeVector.h>
35 
36 #include <cmath>
37 #include <cstdlib>
38 #include <iostream>
39 #include <set>
40 #include <utility>
41 
43  : SubsysReco(name)
44  , _caloname(caloname)
45  , _filename(filename)
46 {
47 }
48 
49 int CaloEvaluator::Init(PHCompositeNode* /*topNode*/)
50 {
51  delete _tfile; // make cppcheck happy
52  _tfile = new TFile(_filename.c_str(), "RECREATE");
53 
54  if (_do_gpoint_eval)
55  {
56  _ntp_gpoint = new TNtuple("ntp_gpoint", "primary vertex => best (first) vertex",
57  "event:gvx:gvy:gvz:"
58  "vx:vy:vz");
59  }
60 
61  if (_do_gshower_eval)
62  {
63  _ntp_gshower = new TNtuple("ntp_gshower", "truth shower => best cluster",
64  "event:gparticleID:gflavor:gnhits:"
65  "geta:gphi:ge:gpt:gvx:gvy:gvz:gembed:gedep:"
66  "clusterID:ntowers:eta:x:y:z:phi:e:efromtruth");
67  }
68 
69  // Barak: Added TTree to will allow the TowerID to be set correctly as integer
70  if (_do_tower_eval)
71  {
72  _ntp_tower = new TNtuple("ntp_tower", "tower => max truth primary",
73  "event:towerID:ieta:iphi:eta:phi:e:x:y:z:"
74  "gparticleID:gflavor:gnhits:"
75  "geta:gphi:ge:gpt:gvx:gvy:gvz:"
76  "gembed:gedep:"
77  "efromtruth");
78 
79  // Make Tree
80  _tower_debug = new TTree("tower_debug", "tower => max truth primary");
81 
82  _tower_debug->Branch("event", &_ievent, "event/I");
83  _tower_debug->Branch("towerID", &_towerID_debug, "towerID/I");
84  _tower_debug->Branch("ieta", &_ieta_debug, "ieta/I");
85  _tower_debug->Branch("iphi", &_iphi_debug, "iphi/I");
86  _tower_debug->Branch("eta", &_eta_debug, "eta/F");
87  _tower_debug->Branch("phi", &_phi_debug, "phi/F");
88  _tower_debug->Branch("e", &_e_debug, "e/F");
89  _tower_debug->Branch("x", &_x_debug, "x/F");
90  _tower_debug->Branch("y", &_y_debug, "y/F");
91  _tower_debug->Branch("z", &_z_debug, "z/F");
92  }
93 
94  if (_do_cluster_eval)
95  {
96  _ntp_cluster = new TNtuple("ntp_cluster", "cluster => max truth primary",
97  "event:clusterID:ntowers:eta:x:y:z:phi:e:"
98  "gparticleID:gflavor:gnhits:"
99  "geta:gphi:ge:gpt:gvx:gvy:gvz:"
100  "gembed:gedep:"
101  "efromtruth");
102  }
103 
105 }
106 
108 {
109  if (!_caloevalstack)
110  {
111  _caloevalstack = new CaloEvalStack(topNode, _caloname);
114  }
115  else
116  {
117  _caloevalstack->next_event(topNode);
118  }
119 
120  //-----------------------------------
121  // print what is coming into the code
122  //-----------------------------------
123 
124  printInputInfo(topNode);
125 
126  //---------------------------
127  // fill the Evaluator NTuples
128  //---------------------------
129 
130  fillOutputNtuples(topNode);
131 
132  //--------------------------------------------------
133  // Print out the ancestry information for this event
134  //--------------------------------------------------
135 
136  printOutputInfo(topNode);
137 
138  ++_ievent;
139  ++m_EvtCounter;
140 
142 }
143 
144 int CaloEvaluator::End(PHCompositeNode* /*topNode*/)
145 {
146  _tfile->cd();
147 
148  if (_do_gpoint_eval)
149  {
150  _ntp_gpoint->Write();
151  }
152  if (_do_gshower_eval)
153  {
154  _ntp_gshower->Write();
155  }
156  if (_do_tower_eval)
157  {
158  _ntp_tower->Write();
159  _tower_debug->Write();
160  }
161  if (_do_cluster_eval)
162  {
163  _ntp_cluster->Write();
164  }
165 
166  _tfile->Close();
167 
168  delete _tfile;
169 
170  if (Verbosity() > 0)
171  {
172  std::cout << "========================= " << Name() << "::End() ============================" << std::endl;
173  std::cout << " " << m_EvtCounter << " events of output written to: " << _filename << std::endl;
174  std::cout << "===========================================================================" << std::endl;
175  }
176 
177  if (_caloevalstack)
178  {
179  delete _caloevalstack;
180  }
181 
183 }
184 
186 {
187  if (Verbosity() > 2)
188  {
189  std::cout << "CaloEvaluator::printInputInfo() entered" << std::endl;
190  }
191 
192  // print out the truth container
193 
194  if (Verbosity() > 1)
195  {
196  std::cout << std::endl;
197  std::cout << PHWHERE << " NEW INPUT FOR EVENT " << _ievent << std::endl;
198  std::cout << std::endl;
199 
200  // need things off of the DST...
201  PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
202  if (!truthinfo)
203  {
204  std::cout << PHWHERE << " ERROR: Can't find G4TruthInfo" << std::endl;
205  exit(-1);
206  }
207 
208  std::cout << Name() << ": PHG4TruthInfoContainer contents: " << std::endl;
209 
210  PHG4TruthInfoContainer::Range truthrange = truthinfo->GetParticleRange();
211  for (PHG4TruthInfoContainer::Iterator truthiter = truthrange.first;
212  truthiter != truthrange.second;
213  ++truthiter)
214  {
215  PHG4Particle* particle = truthiter->second;
216 
217  std::cout << truthiter->first << " => pid: " << particle->get_pid()
218  << " pt: " << sqrt(pow(particle->get_px(), 2) + pow(particle->get_py(), 2)) << std::endl;
219  }
220  }
221 
222  return;
223 }
224 
226 {
227  if (Verbosity() > 2)
228  {
229  std::cout << "CaloEvaluator::printOutputInfo() entered" << std::endl;
230  }
231 
234 
235  //==========================================
236  // print out some useful stuff for debugging
237  //==========================================
238 
239  if (Verbosity() > 1)
240  {
241  // event information
242  std::cout << std::endl;
243  std::cout << PHWHERE << " NEW OUTPUT FOR EVENT " << _ievent << std::endl;
244  std::cout << std::endl;
245 
246  // need things off of the DST...
247  PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
248  if (!truthinfo)
249  {
250  std::cout << PHWHERE << " ERROR: Can't find G4TruthInfo" << std::endl;
251  exit(-1);
252  }
253 
254  // need things off of the DST...
255  GlobalVertexMap* vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
256 
257  PHG4VtxPoint* gvertex = truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex());
258  float gvx = gvertex->get_x();
259  float gvy = gvertex->get_y();
260  float gvz = gvertex->get_z();
261 
262  float vx = NAN;
263  float vy = NAN;
264  float vz = NAN;
265  if (vertexmap)
266  {
267  if (!vertexmap->empty())
268  {
269  GlobalVertex* vertex = (vertexmap->begin()->second);
270 
271  vx = vertex->get_x();
272  vy = vertex->get_y();
273  vz = vertex->get_z();
274  }
275  }
276 
277  std::cout << "vtrue = (" << gvx << "," << gvy << "," << gvz << ") => vreco = (" << vx << "," << vy << "," << vz << ")" << std::endl;
278 
280  for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
281  iter != range.second;
282  ++iter)
283  {
284  PHG4Particle* primary = iter->second;
285 
286  std::cout << std::endl;
287 
288  std::cout << "===Primary PHG4Particle=========================================" << std::endl;
289  std::cout << " particle id = " << primary->get_track_id() << std::endl;
290  std::cout << " flavor = " << primary->get_pid() << std::endl;
291  std::cout << " (px,py,pz,e) = (";
292 
293  float gpx = primary->get_px();
294  float gpy = primary->get_py();
295  float gpz = primary->get_pz();
296  float ge = primary->get_e();
297 
298  std::cout.width(5);
299  std::cout << gpx;
300  std::cout << ",";
301  std::cout.width(5);
302  std::cout << gpy;
303  std::cout << ",";
304  std::cout.width(5);
305  std::cout << gpz;
306  std::cout << ",";
307  std::cout.width(5);
308  std::cout << ge;
309  std::cout << ")" << std::endl;
310 
311  float gpt = std::sqrt(gpx * gpx + gpy * gpy);
312  float geta = NAN;
313  if (gpt != 0.0)
314  {
315  geta = std::asinh(gpz / gpt);
316  }
317  float gphi = std::atan2(gpy, gpx);
318 
319  std::cout << "(eta,phi,e,pt) = (";
320  std::cout.width(5);
321  std::cout << geta;
322  std::cout << ",";
323  std::cout.width(5);
324  std::cout << gphi;
325  std::cout << ",";
326  std::cout.width(5);
327  std::cout << ge;
328  std::cout << ",";
329  std::cout.width(5);
330  std::cout << gpt;
331  std::cout << ")" << std::endl;
332 
333  PHG4VtxPoint* vtx = trutheval->get_vertex(primary);
334  float local_gvx = vtx->get_x();
335  float local_gvy = vtx->get_y();
336  float local_gvz = vtx->get_z();
337 
338  std::cout << " vtrue = (";
339  std::cout.width(5);
340  std::cout << local_gvx;
341  std::cout << ",";
342  std::cout.width(5);
343  std::cout << local_gvy;
344  std::cout << ",";
345  std::cout.width(5);
346  std::cout << local_gvz;
347  std::cout << ")" << std::endl;
348 
349  std::cout << " embed = " << trutheval->get_embed(primary) << std::endl;
350  std::cout << " edep = " << trutheval->get_shower_energy_deposit(primary) << std::endl;
351 
352  std::set<RawCluster*> clusters = clustereval->all_clusters_from(primary);
353  for (auto cluster : clusters)
354  {
355  float ntowers = cluster->getNTowers();
356  float x = cluster->get_x();
357  float y = cluster->get_y();
358  float z = cluster->get_z();
359  float phi = cluster->get_phi();
360  float e = cluster->get_energy();
361 
362  float efromtruth = clustereval->get_energy_contribution(cluster, primary);
363 
364  std::cout << " => #" << cluster->get_id() << " (x,y,z,phi,e) = (";
365  std::cout.width(5);
366  std::cout << x;
367  std::cout << ",";
368  std::cout.width(5);
369  std::cout << y;
370  std::cout << ",";
371  std::cout.width(5);
372  std::cout << z;
373  std::cout << ",";
374  std::cout.width(5);
375  std::cout << phi;
376  std::cout << ",";
377  std::cout.width(5);
378  std::cout << e;
379  std::cout << "), ntowers = " << ntowers << ", efromtruth = " << efromtruth << std::endl;
380  }
381  }
382  std::cout << std::endl;
383  }
384 
385  return;
386 }
387 
389 {
390  if (Verbosity() > 2)
391  {
392  std::cout << "CaloEvaluator::fillOutputNtuples() entered" << std::endl;
393  }
394 
398 
399  //----------------------
400  // fill the Event NTuple
401  //----------------------
402 
403  if (_do_gpoint_eval)
404  {
405  // need things off of the DST...
406  PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
407  if (!truthinfo)
408  {
409  std::cout << PHWHERE << " ERROR: Can't find G4TruthInfo" << std::endl;
410  exit(-1);
411  }
412 
413  // need things off of the DST...
414  GlobalVertexMap* vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
415 
416  PHG4VtxPoint* gvertex = truthinfo->GetPrimaryVtx(truthinfo->GetPrimaryVertexIndex());
417  float gvx = gvertex->get_x();
418  float gvy = gvertex->get_y();
419  float gvz = gvertex->get_z();
420 
421  float vx = NAN;
422  float vy = NAN;
423  float vz = NAN;
424  if (vertexmap)
425  {
426  if (!vertexmap->empty())
427  {
428  GlobalVertex* vertex = (vertexmap->begin()->second);
429 
430  vx = vertex->get_x();
431  vy = vertex->get_y();
432  vz = vertex->get_z();
433  }
434  }
435 
436  float gpoint_data[7] = {(float) _ievent,
437  gvx,
438  gvy,
439  gvz,
440  vx,
441  vy,
442  vz};
443 
444  _ntp_gpoint->Fill(gpoint_data);
445  }
446 
447  //------------------------
448  // fill the Gshower NTuple
449  //------------------------
450 
451  if (_ntp_gshower)
452  {
453  if (Verbosity() > 1)
454  {
455  std::cout << Name() << " CaloEvaluator::filling gshower ntuple..." << std::endl;
456  }
457 
458  GlobalVertexMap* vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
459 
460  PHG4TruthInfoContainer* truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
461  if (!truthinfo)
462  {
463  std::cout << PHWHERE << " ERROR: Can't find G4TruthInfo" << std::endl;
464  exit(-1);
465  }
466 
467  PHG4TruthInfoContainer::ConstRange range = truthinfo->GetPrimaryParticleRange();
468  for (PHG4TruthInfoContainer::ConstIterator iter = range.first;
469  iter != range.second;
470  ++iter)
471  {
472  PHG4Particle* primary = iter->second;
473 
474  if (primary->get_e() < _truth_e_threshold)
475  {
476  continue;
477  }
478 
479  if (!_truth_trace_embed_flags.empty())
480  {
481  if (_truth_trace_embed_flags.find(trutheval->get_embed(primary)) ==
483  {
484  continue;
485  }
486  }
487 
488  float gparticleID = primary->get_track_id();
489  float gflavor = primary->get_pid();
490 
491  PHG4Shower* shower = trutheval->get_primary_shower(primary);
492  float gnhits = NAN;
493  if (shower)
494  {
495  gnhits = shower->get_nhits(trutheval->get_caloid());
496  }
497  else
498  {
499  gnhits = 0.0;
500  }
501  float gpx = primary->get_px();
502  float gpy = primary->get_py();
503  float gpz = primary->get_pz();
504  float ge = primary->get_e();
505 
506  float gpt = std::sqrt(gpx * gpx + gpy * gpy);
507  float geta = NAN;
508  if (gpt != 0.0)
509  {
510  geta = std::asinh(gpz / gpt);
511  }
512  float gphi = std::atan2(gpy, gpx);
513 
514  PHG4VtxPoint* vtx = trutheval->get_vertex(primary);
515  float gvx = vtx->get_x();
516  float gvy = vtx->get_y();
517  float gvz = vtx->get_z();
518 
519  float gembed = trutheval->get_embed(primary);
520  float gedep = trutheval->get_shower_energy_deposit(primary);
521 
522  RawCluster* cluster = clustereval->best_cluster_from(primary);
523 
524  float clusterID = NAN;
525  float ntowers = NAN;
526  float eta = NAN;
527  float x = NAN;
528  float y = NAN;
529  float z = NAN;
530  float phi = NAN;
531  float e = NAN;
532 
533  float efromtruth = NAN;
534 
535  if (cluster)
536  {
537  clusterID = cluster->get_id();
538  ntowers = cluster->getNTowers();
539  x = cluster->get_x();
540  y = cluster->get_y();
541  z = cluster->get_z();
542  phi = cluster->get_phi();
543  e = cluster->get_energy();
544 
545  efromtruth = clustereval->get_energy_contribution(cluster, primary);
546 
547  // require vertex for cluster eta calculation
548  if (vertexmap)
549  {
550  if (!vertexmap->empty())
551  {
552  GlobalVertex* vertex = (vertexmap->begin()->second);
553 
554  eta =
556  *cluster,
557  CLHEP::Hep3Vector(vertex->get_x(), vertex->get_y(), vertex->get_z()));
558  }
559  }
560  }
561 
562  float shower_data[] = {(float) _ievent,
563  gparticleID,
564  gflavor,
565  gnhits,
566  geta,
567  gphi,
568  ge,
569  gpt,
570  gvx,
571  gvy,
572  gvz,
573  gembed,
574  gedep,
575  clusterID,
576  ntowers,
577  eta,
578  x,
579  y,
580  z,
581  phi,
582  e,
583  efromtruth};
584 
585  _ntp_gshower->Fill(shower_data);
586  }
587  }
588 
589  //----------------------
590  // fill the Tower NTuple
591  //----------------------
592 
593  if (_do_tower_eval)
594  {
595  if (Verbosity() > 1)
596  {
597  std::cout << "CaloEvaluator::filling tower ntuple..." << std::endl;
598  }
599 
600  std::string towernode = "TOWER_CALIB_" + _caloname;
601  RawTowerContainer* towers = findNode::getClass<RawTowerContainer>(topNode, towernode.c_str());
602  if (!towers)
603  {
604  std::cout << PHWHERE << " ERROR: Can't find " << towernode << std::endl;
605  exit(-1);
606  }
607 
608  std::string towergeomnode = "TOWERGEOM_" + _caloname;
609  RawTowerGeomContainer* towergeom = findNode::getClass<RawTowerGeomContainer>(topNode, towergeomnode.c_str());
610  if (!towergeom)
611  {
612  std::cout << PHWHERE << " ERROR: Can't find " << towergeomnode << std::endl;
613  exit(-1);
614  }
615 
616  RawTowerContainer::ConstRange begin_end = towers->getTowers();
618  for (rtiter = begin_end.first; rtiter != begin_end.second; ++rtiter)
619  {
620  RawTower* tower = rtiter->second;
621 
622  if (tower->get_energy() < _reco_e_threshold)
623  {
624  continue;
625  }
626 
627  RawTowerGeom* tower_geom = towergeom->get_tower_geometry(tower->get_id());
628  if (!tower_geom)
629  {
630  std::cout << PHWHERE << " ERROR: Can't find tower geometry for this tower hit: ";
631  tower->identify();
632  exit(-1);
633  }
634 
635  // std::cout<<"Tower ID = "<<tower->get_id()<<" for bin(j,k)= "<<tower->get_bineta()<<","<<tower->get_binphi()<<std::endl; //Added by Barak
636  const float towerid = tower->get_id();
637  const float ieta = tower->get_bineta();
638  const float iphi = tower->get_binphi();
639  const float eta = tower_geom->get_eta();
640  const float phi = tower_geom->get_phi();
641  const float e = tower->get_energy();
642  const float x = tower_geom->get_center_x();
643  const float y = tower_geom->get_center_y();
644  const float z = tower_geom->get_center_z();
645 
646  // Added by Barak
647  _towerID_debug = tower->get_id();
648  _ieta_debug = tower->get_bineta();
649  _iphi_debug = tower->get_binphi();
650  _eta_debug = tower_geom->get_eta();
651  _phi_debug = tower_geom->get_phi();
652  _e_debug = tower->get_energy();
653  _x_debug = tower_geom->get_center_x();
654  _y_debug = tower_geom->get_center_y();
655  _z_debug = tower_geom->get_center_z();
656 
657  PHG4Particle* primary = towereval->max_truth_primary_particle_by_energy(tower);
658 
659  float gparticleID = NAN;
660  float gflavor = NAN;
661  float gnhits = NAN;
662  float gpx = NAN;
663  float gpy = NAN;
664  float gpz = NAN;
665  float ge = NAN;
666 
667  float gpt = NAN;
668  float geta = NAN;
669  float gphi = NAN;
670 
671  float gvx = NAN;
672  float gvy = NAN;
673  float gvz = NAN;
674 
675  float gembed = NAN;
676  float gedep = NAN;
677 
678  float efromtruth = NAN;
679 
680  if (primary)
681  {
682  gparticleID = primary->get_track_id();
683  gflavor = primary->get_pid();
684 
685  PHG4Shower* shower = trutheval->get_primary_shower(primary);
686  if (shower)
687  {
688  gnhits = shower->get_nhits(trutheval->get_caloid());
689  }
690  else
691  {
692  gnhits = 0.0;
693  }
694  gpx = primary->get_px();
695  gpy = primary->get_py();
696  gpz = primary->get_pz();
697  ge = primary->get_e();
698 
699  gpt = std::sqrt(gpx * gpx + gpy * gpy);
700  if (gpt != 0.0)
701  {
702  geta = std::asinh(gpz / gpt);
703  }
704  gphi = std::atan2(gpy, gpx);
705 
706  PHG4VtxPoint* vtx = trutheval->get_vertex(primary);
707 
708  if (vtx)
709  {
710  gvx = vtx->get_x();
711  gvy = vtx->get_y();
712  gvz = vtx->get_z();
713  }
714 
715  gembed = trutheval->get_embed(primary);
716  gedep = trutheval->get_shower_energy_deposit(primary);
717 
718  efromtruth = towereval->get_energy_contribution(tower, primary);
719  }
720 
721  float tower_data[] = {(float) _ievent,
722  towerid,
723  ieta,
724  iphi,
725  eta,
726  phi,
727  e,
728  x,
729  y,
730  z,
731  gparticleID,
732  gflavor,
733  gnhits,
734  geta,
735  gphi,
736  ge,
737  gpt,
738  gvx,
739  gvy,
740  gvz,
741  gembed,
742  gedep,
743  efromtruth};
744 
745  _ntp_tower->Fill(tower_data);
746  _tower_debug->Fill(); // Added by Barak (see above for explanation)
747  }
748  }
749 
750  //------------------------
751  // fill the Cluster NTuple
752  //------------------------
753 
754  if (_do_cluster_eval)
755  {
756  if (Verbosity() > 1)
757  {
758  std::cout << "CaloEvaluator::filling gcluster ntuple..." << std::endl;
759  }
760 
761  GlobalVertexMap* vertexmap = findNode::getClass<GlobalVertexMap>(topNode, "GlobalVertexMap");
762 
763  std::string clusternode = "CLUSTER_" + _caloname;
764  RawClusterContainer* clusters = findNode::getClass<RawClusterContainer>(topNode, clusternode.c_str());
765  if (!clusters)
766  {
767  std::cout << PHWHERE << " ERROR: Can't find " << clusternode << std::endl;
768  exit(-1);
769  }
770 
771  // for every cluster
772 
773  for (const auto& iterator : clusters->getClustersMap())
774  {
775  RawCluster* cluster = iterator.second;
776 
777  // for (unsigned int icluster = 0; icluster < clusters->size(); icluster++)
778  // {
779  // RawCluster* cluster = clusters->getCluster(icluster);
780 
781  if (cluster->get_energy() < _reco_e_threshold)
782  {
783  continue;
784  }
785 
786  float clusterID = cluster->get_id();
787  float ntowers = cluster->getNTowers();
788  float x = cluster->get_x();
789  float y = cluster->get_y();
790  float z = cluster->get_z();
791  float eta = NAN;
792  float phi = cluster->get_phi();
793  float e = cluster->get_energy();
794 
795  // require vertex for cluster eta calculation
796  if (vertexmap)
797  {
798  if (!vertexmap->empty())
799  {
800  GlobalVertex* vertex = (vertexmap->begin()->second);
801 
802  eta =
804  *cluster,
805  CLHEP::Hep3Vector(vertex->get_x(), vertex->get_y(), vertex->get_z()));
806  }
807  }
808 
809  PHG4Particle* primary = clustereval->max_truth_primary_particle_by_energy(cluster);
810 
811  float gparticleID = NAN;
812  float gflavor = NAN;
813 
814  float gnhits = NAN;
815  float gpx = NAN;
816  float gpy = NAN;
817  float gpz = NAN;
818  float ge = NAN;
819 
820  float gpt = NAN;
821  float geta = NAN;
822  float gphi = NAN;
823 
824  float gvx = NAN;
825  float gvy = NAN;
826  float gvz = NAN;
827 
828  float gembed = NAN;
829  float gedep = NAN;
830 
831  float efromtruth = NAN;
832 
833  if (primary)
834  {
835  gparticleID = primary->get_track_id();
836  gflavor = primary->get_pid();
837 
838  PHG4Shower* shower = trutheval->get_primary_shower(primary);
839  if (shower)
840  {
841  gnhits = shower->get_nhits(trutheval->get_caloid());
842  }
843  else
844  {
845  gnhits = 0.0;
846  }
847  gpx = primary->get_px();
848  gpy = primary->get_py();
849  gpz = primary->get_pz();
850  ge = primary->get_e();
851 
852  gpt = std::sqrt(gpx * gpx + gpy * gpy);
853  if (gpt != 0.0)
854  {
855  geta = std::asinh(gpz / gpt);
856  }
857  gphi = std::atan2(gpy, gpx);
858 
859  PHG4VtxPoint* vtx = trutheval->get_vertex(primary);
860 
861  if (vtx)
862  {
863  gvx = vtx->get_x();
864  gvy = vtx->get_y();
865  gvz = vtx->get_z();
866  }
867 
868  gembed = trutheval->get_embed(primary);
869  gedep = trutheval->get_shower_energy_deposit(primary);
870 
871  efromtruth = clustereval->get_energy_contribution(cluster,
872  primary);
873  }
874 
875  float cluster_data[] = {(float) _ievent,
876  clusterID,
877  ntowers,
878  eta,
879  x,
880  y,
881  z,
882  phi,
883  e,
884  gparticleID,
885  gflavor,
886  gnhits,
887  geta,
888  gphi,
889  ge,
890  gpt,
891  gvx,
892  gvy,
893  gvz,
894  gembed,
895  gedep,
896  efromtruth};
897 
898  _ntp_cluster->Fill(cluster_data);
899  }
900  }
901 
902  return;
903 }