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