All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MCShowerRecoPart.cxx
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 //
3 // MCShowerRecoPart source
4 //
5 ////////////////////////////////////////////////////////////////////////
6 
7 #include "fhiclcpp/ParameterSet.h"
8 
9 #include "MCShowerRecoPart.h"
11 
12 #include <iostream>
13 #include <limits>
14 
15 namespace sim {
16 
17  const unsigned int MCShowerRecoPart::kINVALID_UINT = std::numeric_limits<unsigned int>::max();
18  const int MCShowerRecoPart::kINVALID_INT = std::numeric_limits<int>::max();
19 
20  //##################################################################
21  MCShowerRecoPart::MCShowerRecoPart(fhicl::ParameterSet const& pset)
22  //##################################################################
23  {
24  _debug_mode = pset.get<bool>("DebugMode");
25  }
26 
27  //-----------------------------------------------------------------------------------------------
29  //-----------------------------------------------------------------------------------------------
30  {
31  _shower_id.clear();
32  _shower_id.resize(part_v.size(),-1);
33  _shower_index.clear();
34  _shower_daughters.clear();
35 
36  if(!part_v.size()) return;
37 
38  // Construct MCShower
39  std::vector<std::multimap<double,unsigned int> > daughter_map;
40  for(size_t i=0; i<part_v.size(); ++i) {
41 
42  auto const& mcp = part_v[i];
43 
44  int candidate_mom_index=-1;
45  if( mcp._pdgcode == 22 ||
46  mcp._pdgcode == 11 ||
47  mcp._pdgcode == -11 )
48  candidate_mom_index = i;
49 
50  unsigned int mom_track = mcp._mother;
51  auto mom_iter = part_v._track_index.find(mom_track);
52  while(mom_iter != part_v._track_index.end()) {
53 
54  unsigned int mom_index = (*mom_iter).second;
55 
56  if( part_v.at(mom_index)._pdgcode == 22 || part_v.at(mom_index)._pdgcode == 11 || part_v.at(mom_index)._pdgcode == -11 )
57 
58  candidate_mom_index = mom_index;
59 
60  mom_iter = part_v._track_index.find(part_v.at(mom_index)._mother);
61 
62  }
63 
64  if(candidate_mom_index >= 0) {
65 
66  auto candidate_mom_iter = _shower_index.find(candidate_mom_index);
67  if(candidate_mom_iter == _shower_index.end()) {
68  _shower_index.insert(std::make_pair((unsigned int)candidate_mom_index, (unsigned int)_shower_index.size()));
69  daughter_map.push_back(std::multimap<double,unsigned int>());
70  }
71  unsigned int shower_index = (*_shower_index.find(candidate_mom_index)).second;
72  daughter_map.at(shower_index).insert(std::make_pair((double)(mcp._start_vtx[3]),(unsigned int)i));
73  _shower_id.at(i) = shower_index;
74 
75  } else if(_debug_mode) {
76 
77  std::cout
78  << "Found a particle that does not belong to a shower!" << std::endl
79  << Form(" PDGID: %d ... Track %d @ (%g,%g,%g,%g) with (%g,%g,%g,%g)",
80  mcp._pdgcode,
81  mcp._track_id,
82  mcp._start_vtx[0],
83  mcp._start_vtx[1],
84  mcp._start_vtx[2],
85  mcp._start_vtx[3],
86  mcp._start_mom[0],
87  mcp._start_mom[1],
88  mcp._start_mom[2],
89  mcp._start_mom[3])
90  << std::endl << std::endl;
91 
92  }
93  }
94 
95 
96  if(_debug_mode)
97  std::cout
98  << Form("Found %zu MCShowers....",_shower_index.size()) << std::endl;
99 
100  _shower_daughters.resize(_shower_index.size(),std::vector<unsigned int>());
101  for(auto const &mom : _shower_index) {
102 
103  _shower_daughters.at(mom.second).reserve(daughter_map.at(mom.second).size());
104  for(auto const &part_index : daughter_map.at(mom.second))
105 
106  _shower_daughters.at(mom.second).push_back(part_index.second);
107 
108  auto const& mcp = part_v.at(mom.first);
109  if(_debug_mode)
110  std::cout
111  << Form("PDGID: %d ... Track %d @ (%g,%g,%g,%g) with (%g,%g,%g,%g) ... %zu daughters!",
112  mcp._pdgcode,
113  mcp._track_id,
114  mcp._start_vtx[0],
115  mcp._start_vtx[1],
116  mcp._start_vtx[2],
117  mcp._start_vtx[3],
118  mcp._start_mom[0],
119  mcp._start_mom[1],
120  mcp._start_mom[2],
121  mcp._start_mom[3],
122  _shower_daughters.at(mom.second).size())
123  << std::endl;
124  }
125 
126  if(_debug_mode)
127  std::cout<<std::endl;
128  }
129 
130 }
std::vector< int > _shower_id
Track index to shower index map.
std::map< unsigned int, unsigned int > _track_index
Track ID =&gt; Index Map.
Definition: MCRecoPart.h:144
std::vector< std::vector< unsigned int > > _shower_daughters
Shower time-ordered daughters.
MCShowerRecoPart(fhicl::ParameterSet const &pset)
Default constructor with fhicl parameters.
static const int kINVALID_INT
bool _debug_mode
lots of stdout stream
std::map< unsigned int, unsigned int > _shower_index
Shower Primary Index ID =&gt; Shower Index Map.
static const unsigned int kINVALID_UINT
BEGIN_PROLOG could also be cout
void ConstructShower(const MCRecoPart &part_v)
Main function to read-in data and fill variables in this algorithm to reconstruct MC shower...