Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CaloRawClusterEval.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CaloRawClusterEval.cc
1 
2 #include "CaloRawClusterEval.h"
3 #include "CaloTruthEval.h"
4 
5 #include <calobase/RawCluster.h>
6 #include <calobase/RawClusterContainer.h>
7 #include <calobase/RawTowerContainer.h>
8 
9 #include <phool/getClass.h>
10 
11 #include <cassert>
12 #include <cfloat>
13 #include <cmath>
14 #include <iostream>
15 #include <map>
16 #include <set>
17 #include <string>
18 
19 class RawTower;
20 
22  : _caloname(caloname)
23  , _towereval(topNode, caloname)
24 {
25  get_node_pointers(topNode);
26 }
27 
29 {
30  if (_verbosity > 0)
31  {
32  if ((_errors > 0) || (_verbosity > 1))
33  {
34  std::cout << "CaloRawClusterEval::~CaloRawClusterEval() - Error Count: " << _errors << std::endl;
35  }
36  }
37 }
38 
40 {
46 
52 
53  _cache_all_truth_hits.clear();
54 
55  _towereval.next_event(topNode);
56 
57  get_node_pointers(topNode);
58 }
59 
61 {
63  {
64  return false;
65  }
66 
67  if (_strict)
68  {
70  }
71  else if (!_clusters)
72  {
73  return false;
74  }
75 
76  if (_strict)
77  {
78  assert(_towers);
79  }
80  else if (!_towers)
81  {
82  return false;
83  }
84 
85  return true;
86 }
87 
89 {
91  {
92  ++_errors;
93  return std::set<PHG4Shower*>();
94  }
95 
96  if (_strict)
97  {
98  assert(cluster);
99  }
100  else if (!cluster)
101  {
102  ++_errors;
103  return std::set<PHG4Shower*>();
104  }
105 
106  if (_do_cache)
107  {
108  std::map<RawCluster*, std::set<PHG4Shower*> >::iterator iter =
109  _cache_all_truth_primary_showers.find(cluster);
110  if (iter != _cache_all_truth_primary_showers.end())
111  {
112  return iter->second;
113  }
114  }
115 
116  std::set<PHG4Shower*> truth_primary_showers;
117 
118  // loop over all the clustered towers
119  RawCluster::TowerConstRange begin_end = cluster->get_towers();
120  for (RawCluster::TowerConstIterator iter = begin_end.first;
121  iter != begin_end.second;
122  ++iter)
123  {
124  RawTower* tower = _towers->getTower(iter->first);
125 
126  if (_strict)
127  {
128  assert(tower);
129  }
130  else if (!tower)
131  {
132  ++_errors;
133  continue;
134  }
135 
136  std::set<PHG4Shower*> new_primary_showers = _towereval.all_truth_primary_showers(tower);
137 
138  for (auto shower : new_primary_showers)
139  {
140  if (_strict)
141  {
142  assert(shower);
143  }
144  else if (!shower)
145  {
146  ++_errors;
147  continue;
148  }
149 
150  truth_primary_showers.insert(shower);
151  }
152  }
153 
154  if (_do_cache)
155  {
156  _cache_all_truth_primary_showers.insert(std::make_pair(cluster, truth_primary_showers));
157  }
158 
159  return truth_primary_showers;
160 }
161 
163 {
165  {
166  ++_errors;
167  return nullptr;
168  }
169 
170  if (_strict)
171  {
172  assert(cluster);
173  }
174  else if (!cluster)
175  {
176  ++_errors;
177  return nullptr;
178  }
179 
180  if (_do_cache)
181  {
182  std::map<RawCluster*, PHG4Shower*>::iterator iter =
185  {
186  return iter->second;
187  }
188  }
189 
190  // loop over all primaries associated with this cluster and
191  // get the energy contribution for each one, record the max
192  PHG4Shower* max_primary = nullptr;
193  float max_e = FLT_MAX * -1.0;
194  std::set<PHG4Shower*> primary_showers = all_truth_primary_showers(cluster);
195  for (auto primary : primary_showers)
196  {
197  if (_strict)
198  {
199  assert(primary);
200  }
201  else if (!primary)
202  {
203  ++_errors;
204  continue;
205  }
206 
207  float e = get_energy_contribution(cluster, primary);
208  if (isnan(e))
209  {
210  continue;
211  }
212  if (e > max_e)
213  {
214  max_e = e;
215  max_primary = primary;
216  }
217  }
218 
219  if (_do_cache)
220  {
221  _cache_max_truth_primary_shower_by_energy.insert(std::make_pair(cluster, max_primary));
222  }
223 
224  return max_primary;
225 }
226 
227 std::set<RawCluster*> CaloRawClusterEval::all_clusters_from(PHG4Shower* primary)
228 {
230  {
231  ++_errors;
232  return std::set<RawCluster*>();
233  }
234 
235  if (_strict)
236  {
237  assert(primary);
238  }
239  else if (!primary)
240  {
241  ++_errors;
242  return std::set<RawCluster*>();
243  }
244 
245  if (!get_truth_eval()->is_primary(primary))
246  {
247  return std::set<RawCluster*>();
248  }
249 
250  primary = get_truth_eval()->get_primary_shower(primary);
251 
252  if (_strict)
253  {
254  assert(primary);
255  }
256  else if (!primary)
257  {
258  ++_errors;
259  return std::set<RawCluster*>();
260  }
261 
262  if (_do_cache)
263  {
264  std::map<PHG4Shower*, std::set<RawCluster*> >::iterator iter =
266  if (iter != _cache_all_clusters_from_primary_shower.end())
267  {
268  return iter->second;
269  }
270  }
271 
272  std::set<RawCluster*> clusters;
273 
274  // loop over all the clusters
276  iter != _clusters->getClusters().second;
277  ++iter)
278  {
279  RawCluster* cluster = iter->second;
280 
281  std::set<PHG4Shower*> primary_showers = all_truth_primary_showers(cluster);
282  for (auto candidate : primary_showers)
283  {
284  if (_strict)
285  {
286  assert(candidate);
287  }
288  else if (!candidate)
289  {
290  ++_errors;
291  continue;
292  }
293 
294  if (get_truth_eval()->are_same_shower(candidate, primary))
295  {
296  clusters.insert(cluster);
297  }
298  }
299  }
300 
301  if (_do_cache)
302  {
303  _cache_all_clusters_from_primary_shower.insert(std::make_pair(primary, clusters));
304  }
305 
306  return clusters;
307 }
308 
310 {
312  {
313  ++_errors;
314  return nullptr;
315  }
316 
317  if (_strict)
318  {
319  assert(primary);
320  }
321  else if (!primary)
322  {
323  ++_errors;
324  return nullptr;
325  }
326 
327  if (!get_truth_eval()->is_primary(primary))
328  {
329  return nullptr;
330  }
331 
332  primary = get_truth_eval()->get_primary_shower(primary);
333 
334  if (_strict)
335  {
336  assert(primary);
337  }
338  else if (!primary)
339  {
340  ++_errors;
341  return nullptr;
342  }
343 
344  if (_do_cache)
345  {
346  std::map<PHG4Shower*, RawCluster*>::iterator iter =
348  if (iter != _cache_best_cluster_from_primary_shower.end())
349  {
350  return iter->second;
351  }
352  }
353 
354  RawCluster* best_cluster = nullptr;
355  float best_energy = FLT_MAX * -1.0;
356  std::set<RawCluster*> clusters = all_clusters_from(primary);
357  for (auto cluster : clusters)
358  {
359  if (_strict)
360  {
361  assert(cluster);
362  }
363  else if (!cluster)
364  {
365  ++_errors;
366  continue;
367  }
368 
369  float energy = get_energy_contribution(cluster, primary);
370  if (isnan(energy))
371  {
372  continue;
373  }
374  if (energy > best_energy)
375  {
376  best_cluster = cluster;
377  best_energy = energy;
378  }
379  }
380 
381  if (_do_cache)
382  {
383  _cache_best_cluster_from_primary_shower.insert(std::make_pair(primary, best_cluster));
384  }
385 
386  return best_cluster;
387 }
388 
390 {
392  {
393  ++_errors;
394  return NAN;
395  }
396 
397  if (_strict)
398  {
399  assert(cluster);
400  assert(primary);
401  }
402  else if (!cluster || !primary)
403  {
404  ++_errors;
405  return NAN;
406  }
407 
408  if (!get_truth_eval()->is_primary(primary))
409  {
410  return NAN;
411  }
412 
413  // reduce cache misses by using only pointer from PrimaryMap
414  primary = get_truth_eval()->get_primary_shower(primary);
415 
416  if (_strict)
417  {
418  assert(primary);
419  }
420  else if (!primary)
421  {
422  ++_errors;
423  return NAN;
424  }
425 
426  if (_do_cache)
427  {
428  std::map<std::pair<RawCluster*, PHG4Shower*>, float>::iterator iter =
429  _cache_get_energy_contribution_primary_shower.find(std::make_pair(cluster, primary));
431  {
432  return iter->second;
433  }
434  }
435 
436  float energy = 0.0;
437 
438  // loop over all the clustered towers
439  RawCluster::TowerConstRange begin_end = cluster->get_towers();
440  for (RawCluster::TowerConstIterator iter = begin_end.first;
441  iter != begin_end.second;
442  ++iter)
443  {
444  RawTower* tower = _towers->getTower(iter->first);
445 
446  if (_strict)
447  {
448  assert(tower);
449  }
450  else if (!tower)
451  {
452  ++_errors;
453  continue;
454  }
455 
456  float edep = get_rawtower_eval()->get_energy_contribution(tower, primary);
457  if (!isnan(edep))
458  {
459  energy += edep;
460  }
461  }
462 
463  if (_do_cache)
464  {
465  _cache_get_energy_contribution_primary_shower.insert(std::make_pair(std::make_pair(cluster, primary), energy));
466  }
467 
468  return energy;
469 }
470 
472 {
474  {
475  ++_errors;
476  return std::set<PHG4Particle*>();
477  }
478 
479  if (_strict)
480  {
481  assert(cluster);
482  }
483  else if (!cluster)
484  {
485  ++_errors;
486  return std::set<PHG4Particle*>();
487  }
488 
489  if (_do_cache)
490  {
491  std::map<RawCluster*, std::set<PHG4Particle*> >::iterator iter =
493  if (iter != _cache_all_truth_primary_particles.end())
494  {
495  return iter->second;
496  }
497  }
498 
499  std::set<PHG4Particle*> truth_primary_particles;
500 
501  std::set<PHG4Shower*> primary_showers = all_truth_primary_showers(cluster);
502 
503  for (auto shower : primary_showers)
504  {
505  if (_strict)
506  {
507  assert(shower);
508  }
509  else if (!shower)
510  {
511  ++_errors;
512  continue;
513  }
514 
516 
517  if (_strict)
518  {
519  assert(particle);
520  }
521  else if (!particle)
522  {
523  ++_errors;
524  continue;
525  }
526 
527  truth_primary_particles.insert(particle);
528  }
529 
530  if (_do_cache)
531  {
532  _cache_all_truth_primary_particles.insert(std::make_pair(cluster, truth_primary_particles));
533  }
534 
535  return truth_primary_particles;
536 }
537 
539 {
541  {
542  ++_errors;
543  return nullptr;
544  }
545 
546  if (_strict)
547  {
548  assert(cluster);
549  }
550  else if (!cluster)
551  {
552  ++_errors;
553  return nullptr;
554  }
555 
556  if (_do_cache)
557  {
558  std::map<RawCluster*, PHG4Particle*>::iterator iter =
561  {
562  return iter->second;
563  }
564  }
565 
566  PHG4Particle* max_primary = nullptr;
567  PHG4Shower* max_shower = max_truth_primary_shower_by_energy(cluster);
568 
569  if (max_shower)
570  {
571  max_primary = get_truth_eval()->get_primary_particle(max_shower);
572  }
573 
574  if (_do_cache)
575  {
576  _cache_max_truth_primary_particle_by_energy.insert(std::make_pair(cluster, max_primary));
577  }
578 
579  return max_primary;
580 }
581 
583 {
585  {
586  ++_errors;
587  return std::set<RawCluster*>();
588  }
589 
590  if (_strict)
591  {
592  assert(primary);
593  }
594  else if (!primary)
595  {
596  ++_errors;
597  return std::set<RawCluster*>();
598  }
599 
600  if (!get_truth_eval()->is_primary(primary))
601  {
602  return std::set<RawCluster*>();
603  }
604 
605  primary = get_truth_eval()->get_primary_particle(primary);
606 
607  if (_strict)
608  {
609  assert(primary);
610  }
611  else if (!primary)
612  {
613  ++_errors;
614  return std::set<RawCluster*>();
615  }
616 
617  if (_do_cache)
618  {
619  std::map<PHG4Particle*, std::set<RawCluster*> >::iterator iter =
622  {
623  return iter->second;
624  }
625  }
626 
627  std::set<RawCluster*> clusters;
628 
630 
631  if (shower)
632  {
633  clusters = all_clusters_from(shower);
634  }
635 
636  if (_do_cache)
637  {
638  _cache_all_clusters_from_primary_particle.insert(std::make_pair(primary, clusters));
639  }
640 
641  return clusters;
642 }
643 
645 {
647  {
648  ++_errors;
649  return nullptr;
650  }
651 
652  if (_strict)
653  {
654  assert(primary);
655  }
656  else if (!primary)
657  {
658  ++_errors;
659  return nullptr;
660  }
661 
662  if (!get_truth_eval()->is_primary(primary))
663  {
664  return nullptr;
665  }
666 
667  primary = get_truth_eval()->get_primary_particle(primary);
668 
669  if (_strict)
670  {
671  assert(primary);
672  }
673  else if (!primary)
674  {
675  ++_errors;
676  return nullptr;
677  }
678 
679  if (_do_cache)
680  {
681  std::map<PHG4Particle*, RawCluster*>::iterator iter =
684  {
685  return iter->second;
686  }
687  }
688 
689  RawCluster* best_cluster = nullptr;
690 
692  if (shower)
693  {
694  best_cluster = best_cluster_from(shower);
695  }
696 
697  if (_do_cache)
698  {
699  _cache_best_cluster_from_primary_particle.insert(std::make_pair(primary, best_cluster));
700  }
701 
702  return best_cluster;
703 }
704 
706 {
708  {
709  ++_errors;
710  return NAN;
711  }
712 
713  if (_strict)
714  {
715  assert(cluster);
716  assert(primary);
717  }
718  else if (!cluster || !primary)
719  {
720  ++_errors;
721  return NAN;
722  }
723 
724  if (!get_truth_eval()->is_primary(primary))
725  {
726  return NAN;
727  }
728 
729  // reduce cache misses by using only pointer from PrimaryMap
730  primary = get_truth_eval()->get_primary_particle(primary);
731 
732  if (_strict)
733  {
734  assert(primary);
735  }
736  else if (!primary)
737  {
738  ++_errors;
739  return 0.;
740  }
741 
742  if (_do_cache)
743  {
744  std::map<std::pair<RawCluster*, PHG4Particle*>, float>::iterator iter =
745  _cache_get_energy_contribution_primary_particle.find(std::make_pair(cluster, primary));
747  {
748  return iter->second;
749  }
750  }
751 
752  float energy = 0.0;
754  if (shower)
755  {
756  float edep = get_energy_contribution(cluster, shower);
757  if (!isnan(edep))
758  {
759  energy += edep;
760  }
761  }
762 
763  if (_do_cache)
764  {
765  _cache_get_energy_contribution_primary_particle.insert(std::make_pair(std::make_pair(cluster, primary), energy));
766  }
767 
768  return energy;
769 }
770 
772 {
774  {
775  return false;
776  }
777 
778  if (_strict)
779  {
780  assert(_clusters);
781  }
782  else if (!_clusters)
783  {
784  return false;
785  }
786 
787  if (_strict)
788  {
789  assert(_towers);
790  }
791  else if (!_towers)
792  {
793  return false;
794  }
795 
796  return true;
797 }
798 
799 std::set<PHG4Hit*> CaloRawClusterEval::all_truth_hits(RawCluster* cluster)
800 {
801  if (!has_full_node_pointers())
802  {
803  ++_errors;
804  return std::set<PHG4Hit*>();
805  }
806 
807  if (_strict)
808  {
809  assert(cluster);
810  }
811  else if (!cluster)
812  {
813  ++_errors;
814  return std::set<PHG4Hit*>();
815  }
816 
817  if (_do_cache)
818  {
819  std::map<RawCluster*, std::set<PHG4Hit*> >::iterator iter =
820  _cache_all_truth_hits.find(cluster);
821  if (iter != _cache_all_truth_hits.end())
822  {
823  return iter->second;
824  }
825  }
826 
827  std::set<PHG4Hit*> truth_hits;
828 
829  // loop over all the clustered towers
830  RawCluster::TowerConstRange begin_end = cluster->get_towers();
831  for (RawCluster::TowerConstIterator iter = begin_end.first;
832  iter != begin_end.second;
833  ++iter)
834  {
835  RawTower* tower = _towers->getTower(iter->first);
836 
837  if (_strict)
838  {
839  assert(tower);
840  }
841  else if (!tower)
842  {
843  ++_errors;
844  continue;
845  }
846 
847  std::set<PHG4Hit*> new_hits = get_rawtower_eval()->all_truth_hits(tower);
848 
849  for (auto g4hit : new_hits)
850  {
851  if (_strict)
852  {
853  assert(g4hit);
854  }
855  else if (!g4hit)
856  {
857  ++_errors;
858  continue;
859  }
860 
861  truth_hits.insert(g4hit);
862  }
863  }
864 
865  if (_do_cache)
866  {
867  _cache_all_truth_hits.insert(std::make_pair(cluster, truth_hits));
868  }
869 
870  return truth_hits;
871 }
872 
874 {
875  // need things off of the DST...
876  std::string nodename = "CLUSTER_" + _caloname;
877  _clusters = findNode::getClass<RawClusterContainer>(topNode, nodename.c_str());
878 
879  std::string towername = "TOWER_CALIB_" + _caloname;
880  _towers = findNode::getClass<RawTowerContainer>(topNode, towername.c_str());
881 
882  return;
883 }