LArSoft  v06_85_00
Liquid Argon Software toolkit - http://larsoft.org/
sim::MCShowerRecoAlg Class Reference

#include "MCShowerRecoAlg.h"

Public Member Functions

 MCShowerRecoAlg (fhicl::ParameterSet const &pset)
 Default constructor with fhicl parameters. More...
 
std::unique_ptr< std::vector< sim::MCShower > > Reconstruct (MCRecoPart &part_v, MCRecoEdep &edep_v)
 

Protected Attributes

MCShowerRecoPart fPartAlg
 
bool fDebugMode
 
double fMinShowerEnergy
 
unsigned int fMinNumDaughters
 

Detailed Description

Definition at line 41 of file MCShowerRecoAlg.h.

Constructor & Destructor Documentation

sim::MCShowerRecoAlg::MCShowerRecoAlg ( fhicl::ParameterSet const &  pset)
explicit

Default constructor with fhicl parameters.

Definition at line 15 of file MCShowerRecoAlg.cxx.

16  : fPartAlg(pset.get<fhicl::ParameterSet>("MCShowerRecoPart")),
17  fDebugMode(pset.get<bool>("DebugMode")),
18  fMinShowerEnergy(pset.get<double>("MinShowerEnergy")),
19  fMinNumDaughters(pset.get<unsigned int>("MinNumDaughters"))
20  //##################################################################
21  {
22  }
MCShowerRecoPart fPartAlg
unsigned int fMinNumDaughters

Member Function Documentation

std::unique_ptr< std::vector< sim::MCShower > > sim::MCShowerRecoAlg::Reconstruct ( MCRecoPart part_v,
MCRecoEdep edep_v 
)

Looping through the MCShower daughter's energy depositions

Looping through MCShower daughters

Looping through MCShowers

Definition at line 25 of file MCShowerRecoAlg.cxx.

References sim::MCMiniPart::_end_mom, sim::MCMiniPart::_end_vtx, sim::MCMiniPart::_pdgcode, sim::MCMiniPart::_process, sim::MCMiniPart::_start_mom, sim::MCMiniPart::_start_vtx, sim::MCMiniPart::_track_id, sim::MCShower::AncestorEnd(), sim::MCShower::AncestorPdgCode(), sim::MCShower::AncestorProcess(), sim::MCShower::AncestorStart(), sim::MCShower::AncestorTrackID(), sim::MCRecoPart::AncestorTrackID(), sim::MCShowerRecoPart::ConstructShower(), sim::details::createPlaneIndexMap(), d, sim::MCShower::DaughterTrackID(), E, e, edep, sim::MCShower::End(), energy, fDebugMode, fMinNumDaughters, fMinShowerEnergy, fPartAlg, sim::MCRecoEdep::GetEdepArrayAt(), sim::kINVALID_DOUBLE, sim::kINVALID_UINT, sim::MCShower::MotherEnd(), sim::MCShower::MotherPdgCode(), sim::MCShower::MotherProcess(), sim::MCShower::MotherStart(), sim::MCShower::MotherTrackID(), sim::MCRecoPart::MotherTrackID(), sim::MCShower::Origin(), sim::MCShower::PdgCode(), sim::MCShower::Process(), sim::MCShowerRecoPart::ShowerDaughters(), sim::MCShowerRecoPart::ShowerMothers(), sim::MCShower::Start(), sim::MCShower::TrackID(), sim::MCRecoEdep::TrackToEdepIndex(), and sim::MCRecoPart::TrackToParticleIndex().

Referenced by MCReco::produce().

27  {
28 
30 
31  auto pindex = details::createPlaneIndexMap();
32 
33  fPartAlg.ConstructShower(part_v);
34  auto result = std::make_unique<std::vector<sim::MCShower>>();
35  auto& mcshower = *result;
36  //std::vector<sim::MCShower> mcshower;
37  // Get shower info from grouped particles
38  const std::vector<unsigned int> shower_index_v = fPartAlg.ShowerMothers();
39  mcshower.reserve(shower_index_v.size());
40  std::vector<size_t> mcs_to_spart_v;
41  mcs_to_spart_v.reserve(shower_index_v.size());
42 
43  bool daughter_stored=false;
44  for(size_t shower_index = 0; shower_index < shower_index_v.size(); ++shower_index) {
45 
46  unsigned int shower_candidate = shower_index_v.at(shower_index);
47  auto const& shower_part = part_v.at(shower_candidate);
48 
49  unsigned int mother_track = part_v.MotherTrackID(shower_candidate);
50  unsigned int ancestor_track = part_v.AncestorTrackID(shower_candidate);
51 
52  if(mother_track == kINVALID_UINT || ancestor_track == kINVALID_UINT)
53 
54  throw cet::exception(__FUNCTION__) << "LOGIC ERROR: mother/ancestor track ID is invalid!";
55 
56  MCMiniPart mother_part;
57  MCMiniPart ancestor_part;
58 
59  unsigned int mother_index = part_v.TrackToParticleIndex(mother_track);
60  unsigned int ancestor_index = part_v.TrackToParticleIndex(ancestor_track);
61 
62  if(mother_index != kINVALID_UINT) mother_part = part_v[mother_index];
63  else mother_part._track_id = mother_track;
64 
65  if(ancestor_index != kINVALID_UINT) ancestor_part = part_v[ancestor_index];
66  else ancestor_part._track_id = ancestor_track;
67 
68  double shower_g4_energy = shower_part._start_mom[3];
69 
70  if(fDebugMode)
71 
72  std::cout << "Found MCShower with mother energy: " << shower_g4_energy << " MeV";
73 
74  // Skip if mother energy is less than the enery threshold
75  if(shower_g4_energy < fMinShowerEnergy) {
76  if(fDebugMode)
77  std::cout << " ... below energy threshold: skipping!"<<std::endl;
78  continue;
79  }else if(shower_part._daughters.size() < fMinNumDaughters) {
80  if(fDebugMode)
81  std::cout << " ... below # daughter particle count threshold: skipping!"<<std::endl;
82  continue;
83  }else if(fDebugMode) {
84  std::cout << " ... condition matched. Storing this MCShower..."<<std::endl;
85  }
86 
87  // Record this MCShower
88  mcs_to_spart_v.push_back(shower_index);
89 
90  if(fDebugMode)
91 
92  std::cout << " Storage index " << mcshower.size() << " => Shower index " << shower_index
93  << std::endl;
94 
95  ::sim::MCShower shower_prof;
96 
97  shower_prof.Origin ( shower_part._origin );
98  shower_prof.PdgCode ( shower_part._pdgcode );
99  shower_prof.TrackID ( shower_part._track_id );
100  shower_prof.Process ( shower_part._process );
101 
102  shower_prof.MotherPdgCode ( mother_part._pdgcode );
103  shower_prof.MotherTrackID ( mother_part._track_id );
104  shower_prof.MotherProcess ( mother_part._process );
105 
106  shower_prof.AncestorPdgCode ( ancestor_part._pdgcode );
107  shower_prof.AncestorTrackID ( ancestor_part._track_id );
108  shower_prof.AncestorProcess ( ancestor_part._process );
109 
110  shower_prof.Start ( MCStep ( shower_part._start_vtx, shower_part._start_mom ) );
111  shower_prof.End ( MCStep ( shower_part._end_vtx, shower_part._end_mom ) );
112  shower_prof.MotherStart ( MCStep ( mother_part._start_vtx, mother_part._start_mom ) );
113  shower_prof.MotherEnd ( MCStep ( mother_part._end_vtx, mother_part._end_mom ) );
114  shower_prof.AncestorStart ( MCStep ( mother_part._start_vtx, mother_part._start_mom ) );
115  shower_prof.AncestorEnd ( MCStep ( mother_part._end_vtx, mother_part._end_mom ) );
116 
117  // Daughter list
118  std::vector<unsigned int> daughter_track_id;
119  daughter_track_id.reserve( fPartAlg.ShowerDaughters(shower_index).size() );
120 
121  for(auto const& index : fPartAlg.ShowerDaughters(shower_index))
122 
123  daughter_track_id.push_back( part_v.at(index)._track_id );
124 
125  shower_prof.DaughterTrackID(daughter_track_id);
126 
127  if(!daughter_stored && daughter_track_id.size()>1) daughter_stored=true;
128 
129  mcshower.push_back(shower_prof);
130  }
131 
132  if(fDebugMode)
133  std::cout << " Found " << mcshower.size() << " MCShowers. Now computing DetProfile position..." << std::endl;
134 
135  //
136  // Daughter vtx
137  //
138  std::vector<TLorentzVector> mcs_daughter_vtx_v(mcshower.size(),TLorentzVector(sim::kINVALID_DOUBLE,
142  std::vector<TLorentzVector> mcs_daughter_mom_v ( mcshower.size(), TLorentzVector() );
143 
144  std::vector< std::vector<double> > plane_charge_v ( mcshower.size(), std::vector<double>(3,0) );
145  std::vector< std::vector<double> > plane_dqdx_v ( mcshower.size(), std::vector<double>(3,0) );
146 
147  //For dEdx Calculation
148  std::vector<double> mcs_daughter_dedx_v ( mcshower.size(), 0 );
149  std::vector<double> mcs_daughter_dedxRAD_v ( mcshower.size(), 0 );
150  std::vector<TVector3> mcs_daughter_dir_v ( mcshower.size(), TVector3() );
151 
152  for(size_t mcs_index=0; mcs_index<mcshower.size(); ++mcs_index) {
153 
154  auto& mcs_daughter_vtx = mcs_daughter_vtx_v[mcs_index];
155  auto& mcs_daughter_mom = mcs_daughter_mom_v[mcs_index];
156  auto& mcs_daughter_dedx = mcs_daughter_dedx_v[mcs_index];
157  auto& mcs_daughter_dedxRAD = mcs_daughter_dedxRAD_v[mcs_index];
158  auto& mcs_daughter_dir = mcs_daughter_dir_v[mcs_index];
159  auto& plane_charge = plane_charge_v[mcs_index];
160  auto& plane_dqdx = plane_dqdx_v[mcs_index];
161 
162  for(auto const& daughter_trk_id : mcshower[mcs_index].DaughterTrackID()) {
163 
164  auto const daughter_part_index = part_v.TrackToParticleIndex(daughter_trk_id);
165 
166  auto const& daughter_part = part_v[daughter_part_index];
167 
168  auto const daughter_edep_index = edep_v.TrackToEdepIndex(daughter_trk_id);
169 
170  if(daughter_edep_index<0) continue;
171 
172  auto const& daughter_edep = edep_v.GetEdepArrayAt(daughter_edep_index);
173 
174  if(!(daughter_edep.size())) continue;
175 
176  // Record first daughter's vtx point
177  double min_dist = sim::kINVALID_DOUBLE;
178  for(auto const& edep : daughter_edep) {
179 
180  double dist = sqrt( pow(edep.pos._x - daughter_part._start_vtx[0],2) +
181  pow(edep.pos._y - daughter_part._start_vtx[1],2) +
182  pow(edep.pos._z - daughter_part._start_vtx[2],2) );
183 
184  if(dist < min_dist) {
185  min_dist = dist;
186  mcs_daughter_vtx[0] = edep.pos._x;
187  mcs_daughter_vtx[1] = edep.pos._y;
188  mcs_daughter_vtx[2] = edep.pos._z;
189  mcs_daughter_vtx[3] = (dist/100. / 2.998e8)*1.e9 + daughter_part._start_vtx[3];
190  }
191 
192  }
193  if(!daughter_stored) {
194  // If daughter is not stored, and shower id energetic enough, attempt to include angle info
195  std::vector<double> shower_dir(3,0);
196  shower_dir[0] = mcshower[mcs_index].Start().Px();
197  shower_dir[1] = mcshower[mcs_index].Start().Py();
198  shower_dir[2] = mcshower[mcs_index].Start().Pz();
199  double magnitude = 0;
200  for(size_t i=0; i<3; ++i)
201  magnitude += pow(shower_dir[i],2);
202 
203  magnitude = sqrt(magnitude);
204 
205  if(magnitude > 1.e-10) {
206  // If enough momentum, include angle info
207  min_dist = sim::kINVALID_DOUBLE;
208 
209  for(auto& v : shower_dir) v /= magnitude;
210 
211  for(auto const& edep : daughter_edep) {
212  std::vector<double> shower_dep_dir(3,0);
213  shower_dep_dir[0] = edep.pos._x - mcshower[mcs_index].Start().X();
214  shower_dep_dir[1] = edep.pos._y - mcshower[mcs_index].Start().Y();
215  shower_dep_dir[2] = edep.pos._z - mcshower[mcs_index].Start().Z();
216 
217  double dist = sqrt( pow(shower_dep_dir[0],2) + pow(shower_dep_dir[1],2) + pow(shower_dep_dir[2],2) );
218  for(auto& v : shower_dep_dir) v /= dist;
219 
220  double angle = acos( shower_dep_dir[0] * shower_dir[0] +
221  shower_dep_dir[1] * shower_dir[1] +
222  shower_dep_dir[2] * shower_dir[2] ) / TMath::Pi() * 180.;
223 
224  if(dist < min_dist && angle < 10) {
225 
226  min_dist = dist;
227  mcs_daughter_vtx[0] = edep.pos._x;
228  mcs_daughter_vtx[1] = edep.pos._y;
229  mcs_daughter_vtx[2] = edep.pos._z;
230  mcs_daughter_vtx[3] = (dist/100. / 2.998e8)*1.e9 + mcshower[mcs_index].Start().T();
231  }
232  }
233  }
234  }
235  break;
236  }
237  // Now take care of momentum & plane charge
238 
239  std::vector<double> mom(3,0);
240  for(auto const& daughter_trk_id : mcshower[mcs_index].DaughterTrackID()) {
241 
242  //auto const daughter_part_index = part_v.TrackToParticleIndex(daughter_trk_id);
243 
244  // for c2: daughter_part is unused
245  //auto const& daughter_part = part_v[daughter_part_index];
246 
247  auto const daughter_edep_index = edep_v.TrackToEdepIndex(daughter_trk_id);
248 
249  if(daughter_edep_index<0) continue;
250 
251  auto const& daughter_edep = edep_v.GetEdepArrayAt(daughter_edep_index);
252 
253  if(!(daughter_edep.size())) continue;
254 
255  //bool first=true; // unused
256  for(auto const& edep : daughter_edep) {
257 
258  // Compute unit vector to this energy deposition
259  mom[0] = edep.pos._x - mcs_daughter_vtx[0];
260  mom[1] = edep.pos._y - mcs_daughter_vtx[1];
261  mom[2] = edep.pos._z - mcs_daughter_vtx[2];
262 
263  // Weight by energy (momentum)
264  double magnitude = sqrt(pow(mom.at(0),2) + pow(mom.at(1),2) + pow(mom.at(2),2));
265 
266  double energy = 0;
267  double npid = 0;
268  for(auto const& pid_energy : edep.deps) {
269  npid++;
270  energy += pid_energy.energy;
271 
272  }
273  energy /= npid;
274  if(magnitude>1.e-10) {
275  mom.at(0) = mom.at(0) * energy / magnitude;
276  mom.at(1) = mom.at(1) * energy / magnitude;
277  mom.at(2) = mom.at(2) * energy / magnitude;
278  mcs_daughter_mom[0] += mom.at(0);
279  mcs_daughter_mom[1] += mom.at(1);
280  mcs_daughter_mom[2] += mom.at(2);
281  }
282  //Determine the direction of the shower right at the start point
283  double E = 0;
284  double N = 0;
285  if(sqrt( pow( edep.pos._x - mcs_daughter_vtx[0],2) +
286  pow( edep.pos._y - mcs_daughter_vtx[1],2) +
287  pow( edep.pos._z - mcs_daughter_vtx[2],2)) < 2.4 && magnitude>1.e-10){
288 
289  mcs_daughter_dir[0] += mom.at(0);
290  mcs_daughter_dir[1] += mom.at(1);
291  mcs_daughter_dir[2] += mom.at(2);
292  E += energy;
293  N += 1;
294  }
295 
296  if(E > 0) E /= N;
297  mcs_daughter_dedxRAD += E;
298 
299  mcs_daughter_mom[3] += energy;
300 
301  // Charge
302  auto const pid = edep.pid;
303  auto q_i = pindex.find(pid);
304  if(q_i != pindex.end())
305  plane_charge[pid.Plane] += (double)(edep.deps[pindex[pid]].charge);
306 
307  }
308 
309  }
310  mcs_daughter_dedxRAD /= 2.4;
311 
312  for(auto const& daughter_trk_id : mcshower[mcs_index].DaughterTrackID()) {
313 
314  //auto const daughter_part_index = part_v.TrackToParticleIndex(daughter_trk_id);
315 
316  // for c2: daughter_part is unused
317  //auto const& daughter_part = part_v[daughter_part_index];
318 
319  auto const daughter_edep_index = edep_v.TrackToEdepIndex(daughter_trk_id);
320 
321  if(daughter_edep_index<0) continue;
322 
323  auto const& daughter_edep = edep_v.GetEdepArrayAt(daughter_edep_index);
324 
325  if(!(daughter_edep.size())) continue;
326 
327  for(auto const& edep : daughter_edep) {
328 
329  //Defining dEdx
330  //Need to define a plane through the shower start point (x_0, y_0, z_0) with a normal along the momentum vector of the shower
331  //The plane will be defined in the typical way:
332  // a*x + b*y + c*z + d = 0
333  // where, a = dir_x, b = dir_y, c = dir_z, d = - (a*x_0+b*y_0+c*z_0)
334  // then the *signed* distance of any point (x_1, y_1, z_1) from this plane is:
335  // D = (a*x_1 + b*y_1 + c*z_1 + d )/sqrt( pow(a,2) + pow(b,2) + pow(c,2))
336 
337 
338 
339  double p_mag = sqrt( pow(mcs_daughter_dir[0],2) + pow(mcs_daughter_dir[1],2) + pow(mcs_daughter_dir[2],2) );
340  double a = 0, b = 0, c = 0, d = 0;
341  if(p_mag > 1.e-10){
342  a = mcs_daughter_dir[0]/p_mag;
343  b = mcs_daughter_dir[1]/p_mag;
344  c = mcs_daughter_dir[2]/p_mag;
345  d = -1*(a*mcs_daughter_vtx[0] + b*mcs_daughter_vtx[1] + c*mcs_daughter_vtx[2]);
346  }
347  else{mcs_daughter_dedx += 0; continue;}
348  //Radial Distance
349  if( (a*edep.pos._x + b*edep.pos._y + c*edep.pos._z + d)/sqrt( pow(a,2) + pow(b,2) + pow(c,2)) < 2.4 &&
350  (a*edep.pos._x + b*edep.pos._y + c*edep.pos._z + d)/sqrt( pow(a,2) + pow(b,2) + pow(c,2)) > 0){
351 
352  double E = 0;
353  double N = 0;
354 
355  for(auto const& pid_energy : edep.deps) {
356  N += 1;
357  E += pid_energy.energy;
358  }
359 
360  if(N > 0){
361  E /= N;
362  }
363  else{ E = 0;}
364 
365  mcs_daughter_dedx += E;
366 
367  // Charge
368  auto const pid = edep.pid;
369  auto q_i = pindex.find(pid);
370  if(q_i != pindex.end())
371  plane_dqdx[pid.Plane] += (double)(edep.deps[pindex[pid]].charge);
372  }
373  }
374  }
375  mcs_daughter_dedx /= 2.4;
376  plane_dqdx.at(0) /= 2.4;
377  plane_dqdx.at(1) /= 2.4;
378  plane_dqdx.at(2) /= 2.4;
379 
380 
381  }
382 
383  if(fDebugMode)
384  std::cout << " Found " << mcshower.size() << " MCShowers. Now storing..." << std::endl;
385 
386  // Store plane charge & daughter momentum
387  for(size_t mcs_index=0; mcs_index<mcshower.size(); ++mcs_index) {
388 
389  auto& daughter_vtx = mcs_daughter_vtx_v[mcs_index];
390  auto& daughter_mom = mcs_daughter_mom_v[mcs_index];
391  auto& daughter_dedx = mcs_daughter_dedx_v[mcs_index];
392  auto& daughter_dedxRAD = mcs_daughter_dedxRAD_v[mcs_index];
393  auto& daughter_dir = mcs_daughter_dir_v[mcs_index];
394  auto& plane_charge = plane_charge_v[mcs_index];
395  auto& plane_dqdx = plane_dqdx_v[mcs_index];
396 
397  double magnitude = sqrt(pow(daughter_mom[0],2)+pow(daughter_mom[1],2)+pow(daughter_mom[2],2));
398 
399  if(daughter_mom[3]>1.e-10) {
400  daughter_mom[0] *= daughter_mom[3]/magnitude;
401  daughter_mom[1] *= daughter_mom[3]/magnitude;
402  daughter_mom[2] *= daughter_mom[3]/magnitude;
403  }else
404  for(size_t i=0; i<4; ++i) daughter_mom[i]=0;
405 
406  mcshower.at(mcs_index).DetProfile( MCStep( daughter_vtx, daughter_mom ) );
407  mcshower.at(mcs_index).Charge(plane_charge);
408  mcshower.at(mcs_index).dQdx(plane_dqdx);
409  mcshower.at(mcs_index).dEdx(daughter_dedx);
410  mcshower.at(mcs_index).dEdxRAD(daughter_dedxRAD);
411  mcshower.at(mcs_index).StartDir(daughter_dir);
412 
413  }
414 
415  if(fDebugMode) {
416 
417  for(auto const& prof : mcshower) {
418 
419  std::cout
420 
421  << Form(" Shower particle: PDG=%d : Track ID=%d Start @ (%g,%g,%g,%g) with Momentum (%g,%g,%g,%g)",
422  prof.PdgCode(), prof.TrackID(),
423  prof.Start().X(),prof.Start().Y(),prof.Start().Z(),prof.Start().T(),
424  prof.Start().Px(),prof.Start().Py(),prof.Start().Pz(),prof.Start().E())
425  << std::endl
426  << Form(" Mother particle: PDG=%d : Track ID=%d Start @ (%g,%g,%g,%g) with Momentum (%g,%g,%g,%g)",
427  prof.MotherPdgCode(), prof.MotherTrackID(),
428  prof.MotherStart().X(),prof.MotherStart().Y(),prof.MotherStart().Z(),prof.MotherStart().T(),
429  prof.MotherStart().Px(),prof.MotherStart().Py(),prof.MotherStart().Pz(),prof.MotherStart().E())
430  << std::endl
431  << Form(" Ancestor particle: PDG=%d : Track ID=%d Start @ (%g,%g,%g,%g) with Momentum (%g,%g,%g,%g)",
432  prof.AncestorPdgCode(), prof.AncestorTrackID(),
433  prof.AncestorStart().X(),prof.AncestorStart().Y(),prof.AncestorStart().Z(),prof.AncestorStart().T(),
434  prof.AncestorStart().Px(),prof.AncestorStart().Py(),prof.AncestorStart().Pz(),prof.AncestorStart().E())
435  << std::endl
436  << Form(" ... with %zu daughters: Start @ (%g,%g,%g,%g) with Momentum (%g,%g,%g,%g)",
437  prof.DaughterTrackID().size(),
438  prof.DetProfile().X(),prof.DetProfile().Y(),prof.DetProfile().Z(),prof.DetProfile().T(),
439  prof.DetProfile().Px(),prof.DetProfile().Py(),prof.DetProfile().Pz(),prof.DetProfile().E())
440  << std::endl
441  << " Charge per plane: ";
442  size_t const nPlanes = prof.Charge().size();
443  for(size_t i=0; i<nPlanes; ++i) {
444 
445  std::cout << " | Plane " << i << std::flush;
446  std::cout << " ... Q = " << prof.Charge(i) << std::flush;
447 
448  }
449  std::cout<<std::endl<<std::endl;
450  }
451  }
452  return result;
453  }
const double kINVALID_DOUBLE
Definition: MCLimits.h:10
const MCStep & End() const
Definition: MCShower.h:56
Float_t E
Definition: plot.C:23
unsigned int TrackID() const
Definition: MCShower.h:53
const std::vector< unsigned int > ShowerMothers() const
MCShowerRecoPart fPartAlg
std::map< geo::PlaneID, size_t > createPlaneIndexMap()
Definition: MCRecoEdep.cxx:17
int PdgCode() const
Definition: MCShower.h:52
unsigned int fMinNumDaughters
const std::vector< unsigned int > & DaughterTrackID() const
Definition: MCShower.h:72
simb::Origin_t Origin() const
Definition: MCShower.h:50
int MotherPdgCode() const
Definition: MCShower.h:58
const std::string & AncestorProcess() const
Definition: MCShower.h:66
double energy
Definition: plottest35.C:25
Float_t d
Definition: plot.C:237
const MCStep & AncestorStart() const
Definition: MCShower.h:67
Double_t edep
Definition: macro.C:13
const std::string & MotherProcess() const
Definition: MCShower.h:60
const std::vector< unsigned int > & ShowerDaughters(const unsigned int shower_id) const
unsigned int AncestorTrackID() const
Definition: MCShower.h:65
const MCStep & AncestorEnd() const
Definition: MCShower.h:68
const MCStep & Start() const
Definition: MCShower.h:55
const MCStep & MotherEnd() const
Definition: MCShower.h:62
const unsigned int kINVALID_UINT
Definition: MCLimits.h:14
unsigned int MotherTrackID() const
Definition: MCShower.h:59
const std::string & Process() const
Definition: MCShower.h:54
const MCStep & MotherStart() const
Definition: MCShower.h:61
int AncestorPdgCode() const
Definition: MCShower.h:64
Float_t e
Definition: plot.C:34
Namespace collecting geometry-related classes utilities.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
void ConstructShower(const MCRecoPart &part_v)
Main function to read-in data and fill variables in this algorithm to reconstruct MC shower...

Member Data Documentation

bool sim::MCShowerRecoAlg::fDebugMode
protected

Definition at line 53 of file MCShowerRecoAlg.h.

Referenced by Reconstruct().

unsigned int sim::MCShowerRecoAlg::fMinNumDaughters
protected

Definition at line 55 of file MCShowerRecoAlg.h.

Referenced by Reconstruct().

double sim::MCShowerRecoAlg::fMinShowerEnergy
protected

Definition at line 54 of file MCShowerRecoAlg.h.

Referenced by Reconstruct().

MCShowerRecoPart sim::MCShowerRecoAlg::fPartAlg
protected

Definition at line 52 of file MCShowerRecoAlg.h.

Referenced by Reconstruct().


The documentation for this class was generated from the following files: