LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
TCShowerElectronLikelihood_module.cc
Go to the documentation of this file.
1 // -------------------------------------------------
2 // makes shower profile templates
3 //
4 // Author: Rory Fitzpatrick (roryfitz@umich.edu)
5 // Created: 8/3/18
6 // -------------------------------------------------
7 
8 // Framework includes
17 #include "fhiclcpp/ParameterSet.h"
20 
38 
39 #include "TTree.h"
40 #include "TFile.h"
41 #include "TH1.h"
42 #include "TH3.h"
43 #include "TProfile.h"
44 #include "TProfile2D.h"
45 #include <TROOT.h>
46 #include <TStyle.h>
47 
48 namespace shower {
49 
51 
52  public:
53 
54  explicit TCShowerElectronLikelihood(fhicl::ParameterSet const& pset);
56 
57  void reconfigure(fhicl::ParameterSet const& pset);
58  void beginJob();
59  void analyze(const art::Event& evt);
60 
61  void getShowerProfile(std::vector< art::Ptr<recob::Hit> > showerhits, TVector3 shwvtx, TVector3 shwdir);
62  void findEnergyBin();
63  void getLongLikelihood();
64  void getTranLikelihood();
65 
66  protected:
67 
68  private:
69  void resetProfiles();
70 
71  std::string fTemplateFile;
72  std::string fROOTfile;
73 
74  TH3F* longTemplate;
75  TH3F* tranTemplate;
81  TProfile2D* longTemplateProf2D;
82  TProfile2D* tranTemplateProf2D;
83  TProfile2D* tranTemplateProf2D_1;
84  TProfile2D* tranTemplateProf2D_2;
85  TProfile2D* tranTemplateProf2D_3;
86  TProfile2D* tranTemplateProf2D_4;
87  TProfile2D* tranTemplateProf2D_5;
88 
89  //TTree* fTree;
90  TH1F* energyDist;
93  // just for printing purposes
94  TH1F* longProfHist;
100 
101  TH1F* longProfile;
102  TH1F* tranProfile;
108 
110  double energyChi2;
111  int maxt;
112 
120 
121  const int LBINS = 20;
122  const int LMIN = 0;
123  const int LMAX = 5;
124 
125  const int TBINS = 20;
126  const int TMIN = -5;
127  const int TMAX = 5;
128 
129  /*
130  const int EBINS = 10;
131  const double EMIN = 0.5;
132  const double EMAX = 10.5;
133  */
134 
135  // unused const int EBINS = 20;
136  // unused const double EMIN = 0.5;
137  // unused const double EMAX = 20.5;
138 
139  const double X0 = 14;
140 
141  std::string fHitModuleLabel;
142  std::string fShowerModuleLabel;
143  std::string fTemplateModuleLabel;
144  std::string fGenieGenModuleLabel;
145  std::string fDigitModuleLabel;
146 
148 
149  }; // class TCShowerElectronLikelihood
150 
151 } // shower
152 
153 // -------------------------------------------------
154 
156  EDAnalyzer(pset),
157  fHitModuleLabel (pset.get< std::string >("HitModuleLabel", "trajcluster" ) ),
158  fShowerModuleLabel (pset.get< std::string >("ShowerModuleLabel", "tcshower" ) ),
159  fGenieGenModuleLabel (pset.get< std::string >("GenieGenModuleLabel", "generator") ),
160  fCalorimetryAlg (pset.get< fhicl::ParameterSet >("CalorimetryAlg") ) {
161  this->reconfigure(pset);
162 } // TCShowerElectronLikelihood
163 
164 // -------------------------------------------------
165 
167 } // ~TCShowerElectronLikelihood
168 
169 // -------------------------------------------------
170 
172  fTemplateFile = pset.get< std::string >("TemplateFile");
173  cet::search_path sp("FW_SEARCH_PATH");
174  if( !sp.find_file(fTemplateFile, fROOTfile) )
175  throw cet::exception("TCShowerElectronLikelihood") << "cannot find the root template file: \n"
176  << fTemplateFile
177  << "\n bail ungracefully.\n";
178 
179  TFile *file = TFile::Open(fROOTfile.c_str());
180 
181  longTemplate = (TH3F*)file->Get("tcshowertemplate/fLongitudinal");
182  tranTemplate = (TH3F*)file->Get("tcshowertemplate/fTransverse");
183  tranTemplate_1 = (TH3F*)file->Get("tcshowertemplate/fTransverse_1");
184  tranTemplate_2 = (TH3F*)file->Get("tcshowertemplate/fTransverse_2");
185  tranTemplate_3 = (TH3F*)file->Get("tcshowertemplate/fTransverse_3");
186  tranTemplate_4 = (TH3F*)file->Get("tcshowertemplate/fTransverse_4");
187  tranTemplate_5 = (TH3F*)file->Get("tcshowertemplate/fTransverse_5");
188 
189  longTemplateProf2D = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoLong2D");
190  tranTemplateProf2D = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D");
191  tranTemplateProf2D_1 = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D_1");
192  tranTemplateProf2D_2 = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D_2");
193  tranTemplateProf2D_3 = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D_3");
194  tranTemplateProf2D_4 = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D_4");
195  tranTemplateProf2D_5 = (TProfile2D*)file->Get("tcshowertemplate/fShowerProfileRecoTrans2D_5");
196 
197  longProfile = new TH1F("longProfile", "longitudinal shower profile;t;Q", LBINS, LMIN, LMAX);
198  tranProfile = new TH1F("tranProfile", "transverse shower profile;dist (cm);Q", TBINS, TMIN, TMAX);;
199 
200  tranProfile_1 = new TH1F("tranProfile_1", "transverse shower profile [0 <= t < 1];dist (cm);Q", TBINS, TMIN, TMAX);;
201  tranProfile_2 = new TH1F("tranProfile_2", "transverse shower profile [1 <= t < 2];dist (cm);Q", TBINS, TMIN, TMAX);;
202  tranProfile_3 = new TH1F("tranProfile_3", "transverse shower profile [2 <= t < 3];dist (cm);Q", TBINS, TMIN, TMAX);;
203  tranProfile_4 = new TH1F("tranProfile_4", "transverse shower profile [3 <= t < 4];dist (cm);Q", TBINS, TMIN, TMAX);;
204  tranProfile_5 = new TH1F("tranProfile_5", "transverse shower profile [4 <= t < 5];dist (cm);Q", TBINS, TMIN, TMAX);;
205 
206 } // reconfigure
207 
208 // -------------------------------------------------
209 
211 
213  //fTree = tfs->make<TTree>("elikelihood", "elikelihood");
214 
215  energyDist = tfs->make<TH1F>("energyDist", "true energy - guess energy", 41, -20.5, 20.5);
216  longLikelihoodHist = tfs->make<TH1F>("longLikelihoodHist", "longitudinal likelihood", 20, 0, 2);
217  tranLikelihoodHist = tfs->make<TH1F>("tranLikelihoodHist", "transverse likelihood", 20, 0, 3);
218 
219  // just for printing purposes
220  longProfHist = tfs->make<TH1F>("longProfHist", "longitudinal e- profile (reco);t;Q", LBINS, LMIN, LMAX);
221  tranProfHist_1 = tfs->make<TH1F>("tranProfHist", "transverse e- profile (reco) [0 <= t < 1];dist (cm);Q", TBINS, TMIN, TMAX);
222  tranProfHist_2 = tfs->make<TH1F>("tranProfHist", "transverse e- profile (reco) [1 <= t < 2];dist (cm);Q", TBINS, TMIN, TMAX);
223  tranProfHist_3 = tfs->make<TH1F>("tranProfHist", "transverse e- profile (reco) [2 <= t < 3];dist (cm);Q", TBINS, TMIN, TMAX);
224  tranProfHist_4 = tfs->make<TH1F>("tranProfHist", "transverse e- profile (reco) [3 <= t < 4];dist (cm);Q", TBINS, TMIN, TMAX);
225  tranProfHist_5 = tfs->make<TH1F>("tranProfHist", "transverse e- profile (reco) [4 <= t < 5];dist (cm);Q", TBINS, TMIN, TMAX);
226 
227 } // beginJob
228 
229 // -------------------------------------------------
230 
232 
233  resetProfiles();
234 
235  art::Handle< std::vector<recob::Hit> > hitListHandle;
236  std::vector<art::Ptr<recob::Hit> > hitlist;
237  if (evt.getByLabel(fHitModuleLabel,hitListHandle))
238  art::fill_ptr_vector(hitlist, hitListHandle);
239 
240  art::Handle< std::vector<recob::Shower> > showerListHandle;
241  std::vector<art::Ptr<recob::Shower> > showerlist;
242  if (evt.getByLabel(fShowerModuleLabel,showerListHandle))
243  art::fill_ptr_vector(showerlist, showerListHandle);
244 
245  art::Handle< std::vector<simb::MCTruth> > mctruthListHandle;
246  std::vector<art::Ptr<simb::MCTruth> > mclist;
247  if (evt.getByLabel(fGenieGenModuleLabel,mctruthListHandle))
248  art::fill_ptr_vector(mclist, mctruthListHandle);
249 
250  art::FindManyP<recob::Hit> shwfm(showerListHandle, evt, fShowerModuleLabel);
251 
252  if (showerlist.size()) {
253  std::vector< art::Ptr<recob::Hit> > showerhits = shwfm.at(0);
254  getShowerProfile(showerhits, showerlist[0]->ShowerStart(), showerlist[0]->Direction());
255 
256  maxt = std::ceil((90 - showerlist[0]->ShowerStart().Z())/X0);
257 
258  findEnergyBin();
261 
264 
265  // check true shower energy
266  if (mclist.size()) {
267  art::Ptr<simb::MCTruth> mctruth = mclist[0];
268  if (mctruth->NeutrinoSet()) {
269  if (std::abs(mctruth->GetNeutrino().Nu().PdgCode()) == 12 && mctruth->GetNeutrino().CCNC() == 0) {
270  double elep = mctruth->GetNeutrino().Lepton().E();
271  // std::cout << "true shower energy: " << elep << std::endl;
272  // std::cout << "energy guess: " << bestE << " (" << bestchi2 << ")" << std::endl;
273  energyDist->Fill(elep - energyGuess);
274  } // cc nue
275  } // neutrinoset
276  } // mclist
277  } // showerlist
278 
285 
286  //fTree->Fill();
287 
288 } // analyze
289 
290 // -------------------------------------------------
291 
293 
294  longProfile->Reset();
295  tranProfile->Reset();
296  tranProfile_1->Reset();
297  tranProfile_2->Reset();
298  tranProfile_3->Reset();
299  tranProfile_4->Reset();
300  tranProfile_5->Reset();
301 
302  energyGuess = -9999;
303  energyChi2 = -9999;
304  maxt = -9999;
305 
306  longLikelihood = -9999;
307  tranLikelihood = -9999;
308  tranLikelihood_1 = -9999;
309  tranLikelihood_2 = -9999;
310  tranLikelihood_3 = -9999;
311  tranLikelihood_4 = -9999;
312  tranLikelihood_5 = -9999;
313 
314  return;
315 
316 } // resetProfiles
317 
318 // -------------------------------------------------
319 
320 void shower::TCShowerElectronLikelihood::getShowerProfile(std::vector< art::Ptr<recob::Hit> > showerhits, TVector3 shwvtx, TVector3 shwdir) {
321 
322  auto const* detprop = lar::providerFrom<detinfo::DetectorPropertiesService>();
324 
325  auto collectionPlane = geo::PlaneID(0, 0, 1);
326 
327  double shwVtxTime = detprop->ConvertXToTicks(shwvtx[0], collectionPlane);
328  double shwVtxWire = geom->WireCoordinate(shwvtx[1], shwvtx[2], collectionPlane);
329 
330  double shwTwoTime = detprop->ConvertXToTicks(shwvtx[0]+shwdir[0], collectionPlane);
331  double shwTwoWire = geom->WireCoordinate(shwvtx[1]+shwdir[1], shwvtx[2]+shwdir[2], collectionPlane);
332 
333  for (size_t i = 0; i < showerhits.size(); ++i) {
334  if (showerhits[i]->WireID().Plane != collectionPlane.Plane) continue;
335 
336  double wirePitch = geom->WirePitch(showerhits[i]->WireID());
337  double tickToDist = detprop->DriftVelocity(detprop->Efield(),detprop->Temperature());
338  tickToDist *= 1.e-3 * detprop->SamplingRate(); // 1e-3 is conversion of 1/us to 1/ns
339 
340  double xvtx = shwVtxTime * tickToDist;
341  double yvtx = shwVtxWire * wirePitch;
342 
343  double xtwo = shwTwoTime * tickToDist;
344  double ytwo = shwTwoWire * wirePitch;
345 
346  double xtwoorth = (ytwo - yvtx) + xvtx;
347  double ytwoorth = -(xtwo - xvtx) + yvtx;
348 
349  double xhit = showerhits[i]->PeakTime() * tickToDist;
350  double yhit = showerhits[i]->WireID().Wire * wirePitch;
351 
352  double ldist = std::abs((ytwoorth-yvtx)*xhit - (xtwoorth-xvtx)*yhit + xtwoorth*yvtx - ytwoorth*xvtx)/std::sqrt( pow((ytwoorth-yvtx), 2) + pow((xtwoorth-xvtx), 2) );
353  double tdist = ((ytwo-yvtx)*xhit - (xtwo-xvtx)*yhit + xtwo*yvtx - ytwo*xvtx)/std::sqrt( pow((ytwo-yvtx), 2) + pow((xtwo-xvtx), 2) );
354 
355  double to3D = 1. / sqrt( pow(xvtx-xtwo,2) + pow(yvtx-ytwo,2) ) ; // distance between two points in 3D space is one
356  ldist *= to3D;
357  tdist *= to3D;
358  double t = ldist/X0;
359 
360  double Q = showerhits[i]->Integral() * fCalorimetryAlg.LifetimeCorrection(showerhits[i]->PeakTime());
361 
362  longProfile->Fill(t, Q);
363  tranProfile->Fill(tdist, Q);
364 
365  if (t < 1) tranProfile_1->Fill(tdist, Q);
366  else if (t < 2) tranProfile_2->Fill(tdist, Q);
367  else if (t < 3) tranProfile_3->Fill(tdist, Q);
368  else if (t < 4) tranProfile_4->Fill(tdist, Q);
369  else if (t < 5) tranProfile_5->Fill(tdist, Q);
370 
371  } // loop through showerhits
372 
373  return;
374 
375 } // getShowerProfile
376 
377 // -------------------------------------------------
378 
380 
381  if (longProfile->GetNbinsX() != longTemplate->GetNbinsX())
382  throw cet::exception("TCShowerElectronLikelihood") << "Bin mismatch in longitudinal profile template \n";
383 
384  if (tranProfile->GetNbinsX() != tranTemplate->GetNbinsX())
385  throw cet::exception("TCShowerElectronLikelihood") << "Bin mismatch in transverse profile template \n";
386 
387  double chi2min = 999999;
388  double bestbin = -1;
389 
390  int ebins = longTemplate->GetNbinsY();
391  int lbins = longTemplate->GetNbinsX();
392  int tbins = tranTemplate->GetNbinsX();
393 
394  // lbins = floor(lbins/2); // only use the first half of the bins
395 
396  TProfile* ltemp;
397  TProfile* ttemp_1;
398  TProfile* ttemp_2;
399  TProfile* ttemp_3;
400  TProfile* ttemp_4;
401  TProfile* ttemp_5;
402 
403  for (int i = 0; i < ebins; ++i) {
404  double thischi2 = 0;
405 
406  ltemp = (TProfile*)longTemplateProf2D->ProfileX("_x", i+1, i+1);
407  ttemp_1 = (TProfile*)tranTemplateProf2D_1->ProfileX("_x_1", i+1, i+1);
408  ttemp_2 = (TProfile*)tranTemplateProf2D_2->ProfileX("_x_2", i+1, i+1);
409  ttemp_3 = (TProfile*)tranTemplateProf2D_3->ProfileX("_x_3", i+1, i+1);
410  ttemp_4 = (TProfile*)tranTemplateProf2D_4->ProfileX("_x_4", i+1, i+1);
411  ttemp_5 = (TProfile*)tranTemplateProf2D_5->ProfileX("_x_5", i+1, i+1);
412 
413  int nlbins = 0;
414  int ntbins = 0;
415 
416  for (int j = 0; j < lbins; ++j) {
417  double obs = longProfile->GetBinContent(j+1);
418  double exp = ltemp->GetBinContent(j+1);
419  if (obs != 0) {
420  thischi2 += pow(obs - exp, 2) / exp;
421  ++nlbins;
422  }
423  } // loop through longitudinal bins
424 
425  for (int j = 0; j < tbins; ++j) {
426  double obs = tranProfile_1->GetBinContent(j+1);
427  double exp = ttemp_1->GetBinContent(j+1);
428  if (obs != 0) {
429  thischi2 += pow(obs - exp, 2) / exp;
430  ++ntbins;
431  }
432 
433  obs = tranProfile_2->GetBinContent(j+1);
434  exp = ttemp_2->GetBinContent(j+1);
435  if (obs != 0) {
436  thischi2 += pow(obs - exp, 2) / exp;
437  ++ntbins;
438  }
439 
440  obs = tranProfile_3->GetBinContent(j+1);
441  exp = ttemp_3->GetBinContent(j+1);
442  if (obs != 0) {
443  thischi2 += pow(obs - exp, 2) / exp;
444  ++ntbins;
445  }
446 
447  obs = tranProfile_4->GetBinContent(j+1);
448  exp = ttemp_4->GetBinContent(j+1);
449  if (obs != 0) {
450  thischi2 += pow(obs - exp, 2) / exp;
451  ++ntbins;
452  }
453 
454  obs = tranProfile_5->GetBinContent(j+1);
455  exp = ttemp_5->GetBinContent(j+1);
456  if (obs != 0) {
457  thischi2 += pow(obs - exp, 2) / exp;
458  ++ntbins;
459  }
460  } // loop through longitudinal bins
461 
462  thischi2 /= (nlbins+ntbins);
463 
464  if (thischi2 < chi2min) {
465  chi2min = thischi2;
466  bestbin = i;
467  }
468 
469  } // loop through energy bins
470 
471  energyChi2 = chi2min;
472  energyGuess = bestbin+1;
473 
474  return;
475 
476 } // findEnergyBin
477 
478 // -------------------------------------------------
479 
481 
482  if (energyGuess < 0) return;
483  int energyBin = energyGuess;
484 
485  longLikelihood = 0;
486  int nbins = 0;
487 
488  for (int i = 0; i < LBINS; ++i) {
489  double qval = longProfile->GetBinContent(i+1);
490  int qbin = longTemplate->GetZaxis()->FindBin(qval);
491  int binentries = longTemplate->GetBinContent(i+1, energyBin, qbin);
492  int totentries = longTemplate->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
493  if (qval > 0) {
494  ++nbins;
495  double prob = (double)binentries/totentries * 100;
496  if (binentries > 0) longLikelihood += log(prob);
497  }
498  } // loop through
499 
500  longLikelihood /= nbins;
501 
502  std::cout << longLikelihood << std::endl;
503 
504  return;
505 
506 } // getLongLikelihood
507 
508 // -------------------------------------------------
509 
511 
512  if (energyGuess < 0) return;
513  int energyBin = energyGuess;
514 
515  tranLikelihood_1 = 0;
516  tranLikelihood_2 = 0;
517  tranLikelihood_3 = 0;
518  tranLikelihood_4 = 0;
519  tranLikelihood_5 = 0;
520 
521  double qval;
522  int qbin, binentries, totentries;
523 
524  int nbins = 0;
525 
526  for (int i = 0; i < TBINS; ++i) {
527  qval = tranProfile_1->GetBinContent(i+1);
528  qbin = tranTemplate_1->GetZaxis()->FindBin(qval);
529  binentries = tranTemplate_1->GetBinContent(i+1, energyBin, qbin);
530  totentries = tranTemplate_1->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
531  if (qval > 0) {
532  ++nbins;
533  double prob = (double)binentries/totentries * 100;
534  if (binentries > 0) tranLikelihood_1 += log(prob);
535  }
536 
537  qval = tranProfile_2->GetBinContent(i+1);
538  qbin = tranTemplate_2->GetZaxis()->FindBin(qval);
539  binentries = tranTemplate_2->GetBinContent(i+1, energyBin, qbin);
540  totentries = tranTemplate_2->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
541  if (qval > 0) {
542  ++nbins;
543  double prob = (double)binentries/totentries * 100;
544  if (binentries > 0) tranLikelihood_2 += log(prob);
545  }
546 
547  qval = tranProfile_3->GetBinContent(i+1);
548  qbin = tranTemplate_3->GetZaxis()->FindBin(qval);
549  binentries = tranTemplate_3->GetBinContent(i+1, energyBin, qbin);
550  totentries = tranTemplate_3->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
551  if (qval > 0) {
552  ++nbins;
553  double prob = (double)binentries/totentries * 100;
554  if (binentries > 0) tranLikelihood_3 += log(prob);
555  }
556 
557  qval = tranProfile_4->GetBinContent(i+1);
558  qbin = tranTemplate_4->GetZaxis()->FindBin(qval);
559  binentries = tranTemplate_4->GetBinContent(i+1, energyBin, qbin);
560  totentries = tranTemplate_4->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
561  if (qval > 0) {
562  ++nbins;
563  double prob = (double)binentries/totentries * 100;
564  if (binentries > 0) tranLikelihood_4 += log(prob);
565  }
566 
567  qval = tranProfile_5->GetBinContent(i+1);
568  qbin = tranTemplate_5->GetZaxis()->FindBin(qval);
569  binentries = tranTemplate_5->GetBinContent(i+1, energyBin, qbin);
570  totentries = tranTemplate_5->Integral(i+1, i+1, energyBin, energyBin, 0, 100);
571  if (qval > 0) {
572  ++nbins;
573  double prob = (double)binentries/totentries * 100;
574  if (binentries > 0) tranLikelihood_5 += log(prob);
575  }
576 
577  } // loop through
578 
579  /*
580  std::cout << tranLikelihood_1 << std::endl;
581  std::cout << tranLikelihood_2 << std::endl;
582  std::cout << tranLikelihood_3 << std::endl;
583  std::cout << tranLikelihood_4 << std::endl;
584  std::cout << tranLikelihood_5 << std::endl;
585  */
586 
588 
589  tranLikelihood /= nbins;
590 
591  std::cout << tranLikelihood << std::endl;
592 
593  return;
594 
595 } // getTranLikelihood
596 
597 // -------------------------------------------------
598 
double E(const int i=0) const
Definition: MCParticle.h:237
int PdgCode() const
Definition: MCParticle.h:216
int CCNC() const
Definition: MCNeutrino.h:152
const simb::MCNeutrino & GetNeutrino() const
Definition: MCTruth.h:74
Declaration of signal hit object.
const simb::MCParticle & Nu() const
Definition: MCNeutrino.h:150
The data type to uniquely identify a Plane.
Definition: geo_types.h:250
STL namespace.
void getShowerProfile(std::vector< art::Ptr< recob::Hit > > showerhits, TVector3 shwvtx, TVector3 shwdir)
object containing MC flux information
TCShowerElectronLikelihood(fhicl::ParameterSet const &pset)
Float_t Z
Definition: plot.C:39
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:265
const simb::MCParticle & Lepton() const
Definition: MCNeutrino.h:151
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:42
Provides recob::Track data product.
parameter set interface
T get(std::string const &key) const
Definition: ParameterSet.h:231
EDAnalyzer(Table< Config > const &config)
Definition: EDAnalyzer.h:100
Declaration of cluster object.
T * make(ARGS...args) const
Utility object to perform functions of association.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
TFile * file
object containing MC truth information necessary for making RawDigits and doing back tracking ...
void reconfigure(fhicl::ParameterSet const &pset)
Direction
Definition: AssnsIter.h:24
bool NeutrinoSet() const
Definition: MCTruth.h:75
TCEvent evt
Definition: DataStructs.cxx:5
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:464
double LifetimeCorrection(double time, double T0=0) const
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33