Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CaloRawTowerEval.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CaloRawTowerEval.cc
1 
2 #include "CaloRawTowerEval.h"
3 #include "CaloTruthEval.h"
4 
5 #include <calobase/RawTower.h>
6 #include <calobase/RawTowerContainer.h>
7 
8 #include <g4detectors/PHG4Cell.h>
10 
12 #include <g4main/PHG4Shower.h>
14 
15 #include <phool/getClass.h>
16 
17 #include <cassert>
18 #include <cfloat>
19 #include <cmath>
20 #include <iostream>
21 #include <map>
22 #include <set>
23 #include <string>
24 
25 class PHG4Hit;
26 
28  : _caloname(caloname)
29  , _trutheval(topNode, caloname)
30 {
31  get_node_pointers(topNode);
32 }
33 
35 {
36  if (_verbosity > 0)
37  {
38  if ((_errors > 0) || (_verbosity > 1))
39  {
40  std::cout << "CaloRawTowerEval::~CaloRawTowerEval() - Error Count: " << _errors << std::endl;
41  }
42  }
43 }
44 
46 {
52 
58 
59  _cache_all_truth_hits.clear();
60 
61  _trutheval.next_event(topNode);
62 
63  get_node_pointers(topNode);
64 }
65 
67 {
69  {
70  return false;
71  }
72 
73  if (_strict)
74  {
75  assert(_towers);
76  }
77  else if (!_towers)
78  {
79  return false;
80  }
81 
82  if (_strict)
83  {
85  }
86  else if (!_truthinfo)
87  {
88  return false;
89  }
90 
91  return true;
92 }
93 
95 {
97  {
98  ++_errors;
99  return std::set<PHG4Shower*>();
100  }
101 
102  if (_strict)
103  {
104  assert(tower);
105  }
106  else if (!tower)
107  {
108  ++_errors;
109  return std::set<PHG4Shower*>();
110  }
111 
112  if (_do_cache)
113  {
114  std::map<RawTower*, std::set<PHG4Shower*> >::iterator iter =
116  if (iter != _cache_all_truth_primary_showers.end())
117  {
118  return iter->second;
119  }
120  }
121 
122  std::set<PHG4Shower*> showers;
123 
124  RawTower::ShowerConstRange shower_range = tower->get_g4showers();
125  for (RawTower::ShowerConstIterator iter = shower_range.first;
126  iter != shower_range.second;
127  ++iter)
128  {
129  PHG4Shower* shower = _truthinfo->GetShower(iter->first);
130 
131  if (_strict)
132  {
133  assert(shower);
134  }
135  else if (!shower)
136  {
137  ++_errors;
138  continue;
139  }
140 
141  showers.insert(shower);
142  }
143 
144  if (_do_cache)
145  {
146  _cache_all_truth_primary_showers.insert(std::make_pair(tower, showers));
147  }
148 
149  return showers;
150 }
151 
153 {
155  {
156  ++_errors;
157  return nullptr;
158  }
159 
160  if (_strict)
161  {
162  assert(tower);
163  }
164  else if (!tower)
165  {
166  ++_errors;
167  return nullptr;
168  }
169 
170  if (_do_cache)
171  {
172  std::map<RawTower*, PHG4Shower*>::iterator iter =
175  {
176  return iter->second;
177  }
178  }
179 
180  PHG4Shower* max_shower = nullptr;
181  float max_e = FLT_MAX * -1.0;
182  std::set<PHG4Shower*> showers = all_truth_primary_showers(tower);
183 
184  for (auto shower : showers)
185  {
186  if (_strict)
187  {
188  assert(shower);
189  }
190  else if (!shower)
191  {
192  ++_errors;
193  continue;
194  }
195 
196  float e = get_energy_contribution(tower, shower);
197  if (isnan(e))
198  {
199  continue;
200  }
201  if (e > max_e)
202  {
203  max_e = e;
204  max_shower = shower;
205  }
206  }
207 
208  if (_do_cache)
209  {
210  _cache_max_truth_primary_shower_by_energy.insert(std::make_pair(tower, max_shower));
211  }
212 
213  return max_shower;
214 }
215 
217 {
219  {
220  ++_errors;
221  return nullptr;
222  }
223 
224  if (_strict)
225  {
226  assert(shower);
227  }
228  else if (!shower)
229  {
230  ++_errors;
231  return nullptr;
232  }
233 
234  if (!_trutheval.is_primary(shower))
235  {
236  return nullptr;
237  }
238 
239  if (_do_cache)
240  {
241  std::map<PHG4Shower*, RawTower*>::iterator iter =
243  if (iter != _cache_best_tower_from_primary_shower.end())
244  {
245  return iter->second;
246  }
247  }
248 
249  RawTower* best_tower = nullptr;
250  float best_energy = FLT_MAX * -1.0;
251  std::set<RawTower*> towers = all_towers_from(shower);
252  for (auto tower : towers)
253  {
254  if (_strict)
255  {
256  assert(tower);
257  }
258  else if (!tower)
259  {
260  ++_errors;
261  continue;
262  }
263 
264  float energy = get_energy_contribution(tower, shower);
265  if (isnan(energy))
266  {
267  continue;
268  }
269  if (energy > best_energy)
270  {
271  best_tower = tower;
272  best_energy = energy;
273  }
274  }
275 
276  if (_do_cache)
277  {
278  _cache_best_tower_from_primary_shower.insert(std::make_pair(shower, best_tower));
279  }
280 
281  return best_tower;
282 }
283 
285 {
287  {
288  ++_errors;
289  return std::set<RawTower*>();
290  }
291 
292  if (_strict)
293  {
294  assert(shower);
295  }
296  else if (!shower)
297  {
298  ++_errors;
299  return std::set<RawTower*>();
300  }
301 
302  if (!_trutheval.is_primary(shower))
303  {
304  return std::set<RawTower*>();
305  }
306 
307  if (_do_cache)
308  {
309  std::map<PHG4Shower*, std::set<RawTower*> >::iterator iter =
311  if (iter != _cache_all_towers_from_primary_shower.end())
312  {
313  return iter->second;
314  }
315  }
316 
317  std::set<RawTower*> towers;
318 
319  // loop over all the towers
320  for (RawTowerContainer::Iterator iter = _towers->getTowers().first;
321  iter != _towers->getTowers().second;
322  ++iter)
323  {
324  RawTower* tower = iter->second;
325 
326  std::set<PHG4Shower*> showers = all_truth_primary_showers(tower);
327  for (auto candidate : showers)
328  {
329  if (_strict)
330  {
331  assert(candidate);
332  }
333  else if (!candidate)
334  {
335  ++_errors;
336  continue;
337  }
338 
339  if (candidate->get_id() == shower->get_id())
340  {
341  towers.insert(tower);
342  }
343  }
344  }
345 
346  if (_do_cache)
347  {
348  _cache_all_towers_from_primary_shower.insert(std::make_pair(shower, towers));
349  }
350 
351  return towers;
352 }
353 
355 {
357  {
358  ++_errors;
359  return NAN;
360  }
361 
362  if (_strict)
363  {
364  assert(tower);
365  assert(shower);
366  }
367  else if (!tower || !shower)
368  {
369  ++_errors;
370  return NAN;
371  }
372 
373  if (!_trutheval.is_primary(shower))
374  {
375  return NAN;
376  }
377 
378  if (_do_cache)
379  {
380  std::map<std::pair<RawTower*, PHG4Shower*>, float>::iterator iter =
381  _cache_get_energy_contribution_primary_shower.find(std::make_pair(tower, shower));
383  {
384  return iter->second;
385  }
386  }
387 
388  // loop over the tower shower entries
389  float energy = 0.0;
390  RawTower::ShowerConstRange range = tower->get_g4showers();
391  RawTower::ShowerConstIterator iter = tower->find_g4shower(shower->get_id());
392  if (iter != range.second)
393  {
394  energy = iter->second;
395  }
396 
397  if (_do_cache)
398  {
399  _cache_get_energy_contribution_primary_shower.insert(std::make_pair(std::make_pair(tower, shower), energy));
400  }
401 
402  return energy;
403 }
404 
406 {
408  {
409  ++_errors;
410  return std::set<PHG4Particle*>();
411  }
412 
413  if (_strict)
414  {
415  assert(tower);
416  }
417  else if (!tower)
418  {
419  ++_errors;
420  return std::set<PHG4Particle*>();
421  }
422 
423  if (_do_cache)
424  {
425  std::map<RawTower*, std::set<PHG4Particle*> >::iterator iter =
427  if (iter != _cache_all_truth_primary_particles.end())
428  {
429  return iter->second;
430  }
431  }
432 
433  std::set<PHG4Particle*> truth_primaries;
434 
435  std::set<PHG4Shower*> showers = all_truth_primary_showers(tower);
436 
437  for (auto shower : showers)
438  {
440 
441  if (_strict)
442  {
443  assert(primary);
444  }
445  else if (!primary)
446  {
447  ++_errors;
448  continue;
449  }
450 
451  truth_primaries.insert(primary);
452  }
453 
454  if (_do_cache)
455  {
456  _cache_all_truth_primary_particles.insert(std::make_pair(tower, truth_primaries));
457  }
458 
459  return truth_primaries;
460 }
461 
463 {
465  {
466  ++_errors;
467  return nullptr;
468  }
469 
470  if (_strict)
471  {
472  assert(tower);
473  }
474  else if (!tower)
475  {
476  ++_errors;
477  return nullptr;
478  }
479 
480  if (_do_cache)
481  {
482  std::map<RawTower*, PHG4Particle*>::iterator iter =
485  {
486  return iter->second;
487  }
488  }
489 
490  PHG4Particle* max_primary = nullptr;
491  PHG4Shower* max_shower = max_truth_primary_shower_by_energy(tower);
492 
493  if (max_shower)
494  {
495  max_primary = get_truth_eval()->get_primary_particle(max_shower);
496  }
497 
498  if (_do_cache)
499  {
500  _cache_max_truth_primary_particle_by_energy.insert(std::make_pair(tower, max_primary));
501  }
502 
503  return max_primary;
504 }
505 
506 std::set<RawTower*> CaloRawTowerEval::all_towers_from(PHG4Particle* primary)
507 {
509  {
510  ++_errors;
511  return std::set<RawTower*>();
512  }
513 
514  if (_strict)
515  {
516  assert(primary);
517  }
518  else if (!primary)
519  {
520  ++_errors;
521  return std::set<RawTower*>();
522  }
523 
524  if (!_trutheval.is_primary(primary))
525  {
526  return std::set<RawTower*>();
527  }
528 
529  // use primary map pointer
530  primary = get_truth_eval()->get_primary_particle(primary);
531 
532  if (_strict)
533  {
534  assert(primary);
535  }
536  else if (!primary)
537  {
538  ++_errors;
539  return std::set<RawTower*>();
540  }
541 
542  if (_do_cache)
543  {
544  std::map<PHG4Particle*, std::set<RawTower*> >::iterator iter =
546  if (iter != _cache_all_towers_from_primary_particle.end())
547  {
548  return iter->second;
549  }
550  }
551 
552  std::set<RawTower*> towers;
553 
555 
556  if (shower)
557  {
558  towers = all_towers_from(shower);
559  }
560 
561  if (_do_cache)
562  {
563  _cache_all_towers_from_primary_particle.insert(std::make_pair(primary, towers));
564  }
565 
566  return towers;
567 }
568 
570 {
572  {
573  ++_errors;
574  return nullptr;
575  }
576 
577  if (_strict)
578  {
579  assert(primary);
580  }
581  else if (!primary)
582  {
583  ++_errors;
584  return nullptr;
585  }
586 
587  if (!_trutheval.is_primary(primary))
588  {
589  return nullptr;
590  }
591 
592  primary = get_truth_eval()->get_primary_particle(primary);
593 
594  if (_strict)
595  {
596  assert(primary);
597  }
598  else if (!primary)
599  {
600  ++_errors;
601  return nullptr;
602  }
603 
604  if (_do_cache)
605  {
606  std::map<PHG4Particle*, RawTower*>::iterator iter =
608  if (iter != _cache_best_tower_from_primary_particle.end())
609  {
610  return iter->second;
611  }
612  }
613 
614  RawTower* best_tower = nullptr;
616  if (shower)
617  {
618  best_tower = best_tower_from(shower);
619  }
620 
621  if (_do_cache)
622  {
623  _cache_best_tower_from_primary_particle.insert(std::make_pair(primary, best_tower));
624  }
625 
626  return best_tower;
627 }
628 
629 // overlap calculations
631 {
633  {
634  ++_errors;
635  return NAN;
636  }
637 
638  if (_strict)
639  {
640  assert(tower);
641  assert(primary);
642  }
643  else if (!tower || !primary)
644  {
645  ++_errors;
646  return NAN;
647  }
648 
649  if (!_trutheval.is_primary(primary))
650  {
651  return NAN;
652  }
653 
654  // reduce cache misses by using only pointer from PrimaryMap
655  primary = get_truth_eval()->get_primary_particle(primary);
656 
657  if (_strict)
658  {
659  assert(primary);
660  }
661  else if (!primary)
662  {
663  ++_errors;
664  return NAN;
665  }
666 
667  if (_do_cache)
668  {
669  std::map<std::pair<RawTower*, PHG4Particle*>, float>::iterator iter =
670  _cache_get_energy_contribution_primary_particle.find(std::make_pair(tower, primary));
672  {
673  return iter->second;
674  }
675  }
676 
677  float energy = 0.0;
678 
680 
681  if (shower)
682  {
683  energy = get_energy_contribution(tower, shower);
684  }
685 
686  if (_do_cache)
687  {
688  _cache_get_energy_contribution_primary_particle.insert(std::make_pair(std::make_pair(tower, primary), energy));
689  }
690 
691  return energy;
692 }
693 
695 {
697  {
698  return false;
699  }
700 
701  if (_strict)
702  {
703  assert(_towers);
704  }
705  else if (!_towers)
706  {
707  return false;
708  }
709 
710  if (_strict)
711  {
712  assert(_g4cells);
713  }
714  else if (!_g4cells)
715  {
716  return false;
717  }
718 
719  if (_strict)
720  {
721  assert(_g4hits);
722  }
723  else if (!_g4hits)
724  {
725  return false;
726  }
727 
728  if (_strict)
729  {
731  }
732  else if (!_truthinfo)
733  {
734  return false;
735  }
736 
737  return true;
738 }
739 
741 {
742  if (!has_full_node_pointers())
743  {
744  ++_errors;
745  return std::set<PHG4Hit*>();
746  }
747 
748  if (_strict)
749  {
750  assert(tower);
751  }
752  else if (!tower)
753  {
754  ++_errors;
755  return std::set<PHG4Hit*>();
756  }
757 
758  if (_do_cache)
759  {
760  std::map<RawTower*, std::set<PHG4Hit*> >::iterator iter =
761  _cache_all_truth_hits.find(tower);
762  if (iter != _cache_all_truth_hits.end())
763  {
764  return iter->second;
765  }
766  }
767 
768  std::set<PHG4Hit*> truth_hits;
769  // loop over all the towered cells
770  RawTower::CellConstRange cell_range = tower->get_g4cells();
771  for (RawTower::CellConstIterator cell_iter = cell_range.first;
772  cell_iter != cell_range.second; ++cell_iter)
773  {
774  unsigned int cell_id = cell_iter->first;
775  PHG4Cell* cell = _g4cells->findCell(cell_id);
776 
777  if (_strict)
778  {
779  assert(cell);
780  }
781  else if (!cell)
782  {
783  ++_errors;
784  continue;
785  }
786 
787  // loop over all the g4hits in this cell
788  for (PHG4Cell::EdepConstIterator hit_iter = cell->get_g4hits().first;
789  hit_iter != cell->get_g4hits().second;
790  ++hit_iter)
791  {
792  PHG4Hit* g4hit = _g4hits->findHit(hit_iter->first);
793 
794  if (_strict)
795  {
796  assert(g4hit);
797  }
798  else if (!g4hit)
799  {
800  ++_errors;
801  continue;
802  }
803 
804  // fill output set
805  truth_hits.insert(g4hit);
806  }
807  }
808 
809  if (_do_cache)
810  {
811  _cache_all_truth_hits.insert(std::make_pair(tower, truth_hits));
812  }
813 
814  return truth_hits;
815 }
816 
818 {
819  // need things off of the DST...
820  std::string towername = "TOWER_CALIB_" + _caloname;
821  _towers = findNode::getClass<RawTowerContainer>(topNode, towername.c_str());
822 
823  std::string cellname = "G4CELL_" + _caloname;
824  _g4cells = findNode::getClass<PHG4CellContainer>(topNode, cellname.c_str());
825 
826  std::string hitname = "G4HIT_" + _caloname;
827  _g4hits = findNode::getClass<PHG4HitContainer>(topNode, hitname.c_str());
828 
829  _truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
830 
831  return;
832 }