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